/ Hex Artifact Content
Login

Artifact e27dfc8fd55b7df98ade7341da66bacb1de98589cbf5a0de7dcaa708d41769bc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a20: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8a30: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8a40: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8a50: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8a60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a70: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8a90: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8aa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8ab0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8ac0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8ad0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8ae0: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b10: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8b20: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8b30: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8b50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8b60: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8b70: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8b80: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8b90: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8bc0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8bd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8be0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c00: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c10: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8c40: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8c50: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8c60: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8c80: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8c90: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8ca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8cb0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8cc0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8cd0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8ce0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8cf0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d00: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d10: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8d20: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8d30: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8d40: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8d50: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8d60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8d70: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8d80: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8d90: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8da0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8db0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8dc0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8dd0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8de0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8df0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8e50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8e60: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8e70: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8e80: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8e90: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ea0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8eb0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8ec0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8ed0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8ee0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8ef0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f00: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f10: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8f20: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8f30: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8f40: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8f50: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8f60: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8f70: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8f80: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8f90: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8fa0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8fb0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8fc0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8fd0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9000: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9010: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
9020: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
9030: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
9050: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
9060: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
9070: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9080: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9090: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
90a0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
90b0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
90c0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
90d0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
90e0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
90f0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9100: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9110: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
9120: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
9130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
9140: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
9150: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
9160: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
9170: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9180: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9190: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
91a0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
91b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
91c0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
91d0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
91e0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
91f0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9200: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9210: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
9220: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
9230: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
9240: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
9250: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9260: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
9270: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9280: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9290: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92a0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
92b0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
92c0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
92d0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
92e0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
92f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9300: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9310: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9320: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9330: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
9340: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
9350: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
9360: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
9370: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9380: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9390: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
93a0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
93b0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
93c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
93d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
93e0: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
93f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9410: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9420: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9430: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9440: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9460: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9470: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9480: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9490: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
94a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
94c0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
94d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
94f0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9500: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9510: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9520: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9530: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9540: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9560: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9570: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9580: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9590: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
95a0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
95b0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
95f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9600: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9610: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9620: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9630: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9640: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9650: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9660: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
96a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
96b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
96c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
96d0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
96e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
96f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9700: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9710: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9730: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9750: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9780: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9790: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
97a0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
97b0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
97c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
97d0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
97e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
97f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9800: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9810: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9820: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9830: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9840: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9850: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9860: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
9870: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9880: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9890: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
98a0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
98b0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
98c0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
98d0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
98e0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
98f0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9900: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9910: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9920: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9930: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9940: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9950: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9960: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
9970: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9980: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9990: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
99a0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
99b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
99c0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
99d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
99e0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
99f0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a00: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a10: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9a30: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9a40: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9a50: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9a60: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9a70: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9a80: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9a90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
9ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9ad0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9ae0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9af0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9b00: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9b10: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9b20: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9b30: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9b40: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9b50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9b60: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
9b70: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
9b80: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
9b90: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
9ba0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
9bb0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
9bc0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9bd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9be0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9bf0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9c00: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9c10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c20: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9c30: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9c40: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9c60: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
9c70: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9c80: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9c90: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
9ca0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
9cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cc0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9cd0: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9ce0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9cf0: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9d00: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9d10: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9d20: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9d30: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9d40: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9d50: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9d60: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
9d70: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
9d90: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
9da0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
9db0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9dc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9dd0: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9de0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9df0: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9e00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9e10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9e20: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9e30: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9e40: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9e50: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9e60: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9e70: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9e80: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ea0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9eb0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9ec0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9ed0: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9ee0: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9ef0: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9f00: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9f10: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9f20: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9f30: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9f40: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9f50: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9f60: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9f70: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9f80: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9f90: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9fa0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9fb0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9fc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fd0: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9fe0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9ff0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a000: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
a010: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a020: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
a030: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
a040: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
a050: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
a060: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
a070: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
a080: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
a090: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
a0c0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
a0d0: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
a0e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a0f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
a100: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
a110: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
a120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
a130: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
a140: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
a150: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a160: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
a170: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a180: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
a190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a1a0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
a1b0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
a1c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
a1d0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
a1e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a1f0: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
a200: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
a210: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
a220: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
a230: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a250: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
a260: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
a270: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
a280: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
a290: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
a2a0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
a2b0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
a2c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
a2d0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
a2e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a2f0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
a300: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
a310: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
a320: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a330: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
a340: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a350: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a360: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a370: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a380: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a390: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a3a0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a3b0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a3c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a3d0: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a3e0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a3f0: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a400: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a410: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a420: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a430: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a440: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a450: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a460: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a470: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a480: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a4a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a4c0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a4d0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a4e0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a500: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a510: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a520: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a550: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a560: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a570: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a580: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a590: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a5a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a5c0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a5d0: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a5e0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a5f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a600: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a610: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a620: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a630: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a660: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a670: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a680: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a690: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a6a0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a6d0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a6e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a6f0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a700: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a710: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a720: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a730: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a750: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a760: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a770: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a780: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a790: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a7a0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a7b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a7c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a7e0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a7f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a820: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a830: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a840: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a850: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a870: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a890: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a8b0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a8f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a900: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a910: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a920: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a930: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a940: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a950: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a960: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a970: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a990: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a9a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a9b0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a9c0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a9d0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a9e0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a9f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
aa00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
aa10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
aa20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
aa30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
aa40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
aa50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
aa60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
aa70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
aa90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
aab0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
aac0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
aad0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
aae0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
aaf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
ab00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ab10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ab30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
ab40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
ab50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
ab60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ab70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
ab80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ab90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aba0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
abb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
abc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
abd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
abe0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
abf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
ac00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
ac10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
ac20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
ac30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
ac40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
ac50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
ac60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
ac70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
ac80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
ac90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
aca0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
acb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
acc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
ace0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
acf0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
ad00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
ad20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
ad30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
ad40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
ad50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
ad60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
ad70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ad80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
ad90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
ada0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
adb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
adc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
add0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
ade0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
adf0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
ae00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
ae10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
ae20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
ae30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
ae40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
ae50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
ae60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
ae70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
ae80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
ae90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aea0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aeb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aec0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
aed0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
aee0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
aef0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
af00: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
af10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
af20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
af30: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
af40: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
af50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
af60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
af70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
af80: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
af90: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
afa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
afb0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
afc0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
afd0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
afe0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
aff0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b000: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b020: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b030: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b040: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b060: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b070: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b090: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b0a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b0b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b0c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b0d0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b0e0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b0f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b130: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b140: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b150: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b170: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b180: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b190: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b1a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b1b0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b1c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b1d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b1e0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b1f0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b210: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b220: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b230: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b240: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b260: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b270: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b280: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b290: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b2a0: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b2b0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b2c0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b2d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b2e0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b2f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b300: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b320: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b330: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b340: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b360: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b370: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b380: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b390: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b3a0: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b3b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b3c0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b3d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b3e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b400: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b430: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b440: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b450: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b460: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b470: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b480: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b490: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b4a0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
b4b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
b4c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b4d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
b4e0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
b4f0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
b500: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
b510: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
b520: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
b530: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
b540: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
b550: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
b560: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
b570: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
b580: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b590: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
b5a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
b5b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
b5c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
b5e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
b5f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b600: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
b610: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b620: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
b630: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
b640: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b650: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
b660: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
b670: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b680: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
b690: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b6a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
b6c0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
b6d0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
b6e0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b6f0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
b700: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b710: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b720: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
b730: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b740: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b750: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
b760: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
b770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
b780: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
b790: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7a0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b7b0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b7c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b7d0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b7e0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
b7f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
b800: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
b810: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
b820: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
b830: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
b840: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b850: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
b860: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
b870: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b880: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b890: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b8a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b8b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
b8c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b8d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
b8e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8f0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
b900: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
b910: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
b920: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
b930: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
b940: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
b950: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
b960: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b970: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b980: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b990: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b9a0: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b9b0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b9c0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b9d0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b9e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
ba10: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
ba20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
ba30: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
ba40: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
ba50: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
ba60: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
ba70: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
ba80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ba90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
baa0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
bab0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
bac0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
bad0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
bae0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
baf0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
bb00: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
bb10: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
bb20: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
bb30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bb40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
bb50: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
bb60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
bb70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bb80: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bb90: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
bba0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
bbb0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
bbc0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bbd0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
bbe0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
bbf0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
bc00: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
bc10: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
bc20: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
bc30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bc40: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
bc50: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
bc60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bc80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bc90: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bca0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bcb0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
bcc0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
bcd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bce0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
bcf0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
bd00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd10: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
bd20: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
bd30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bd50: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
bd60: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
bd70: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
bd80: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
bd90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
bda0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
bdb0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
bdc0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
bdd0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
bde0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
bdf0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
be00: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
be10: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
be20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
be30: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
be40: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
be50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
be60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
be70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
be80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
be90: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
bea0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
beb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
bec0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bed0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bee0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
bef0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
bf00: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
bf10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
bf20: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
bf30: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
bf40: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
bf50: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
bf60: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
bf70: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bf80: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
bf90: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
bfa0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
bfb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bfc0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
bfd0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
bfe0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
bff0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c000: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c010: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c020: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c030: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c040: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c050: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c060: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c070: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c080: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c090: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c0a0: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c0b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c0c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c0d0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c0e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c0f0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c100: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c110: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
c120: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c130: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
c140: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c150: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
c160: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
c170: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c180: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c190: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
c1a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
c1b0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
c1c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
c1d0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
c1e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c1f0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
c200: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c210: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
c220: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
c230: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
c240: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c250: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
c260: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
c270: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
c280: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c290: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
c2a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c2b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
c2c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
c2d0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
c2e0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
c2f0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
c300: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c320: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c330: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c340: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c350: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c360: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c370: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c380: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c390: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c3a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c3b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c3c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c3f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c400: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c410: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c420: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c430: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c440: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c450: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c460: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c470: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c480: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
c490: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c4a0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
c4b0: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
c4c0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c4d0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4f0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
c500: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
c510: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
c520: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
c530: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
c550: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
c560: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
c570: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
c580: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
c590: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
c5a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
c5b0: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
c5c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c5d0: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
c5e0: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
c5f0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
c600: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
c610: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
c620: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c630: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
c640: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c650: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
c660: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
c670: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
c680: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
c690: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
c6a0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
c6b0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
c6c0: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
c6d0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
c6e0: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
c6f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c700: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
c710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c740: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c750: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
c760: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
c770: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
c780: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
c790: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
c7a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
c7b0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c7c0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c7d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
c7e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
c7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c810: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c820: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c830: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c850: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
c860: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
c870: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c880: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c890: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c8a0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
c8b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
c8c0: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
c8d0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
c8e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c8f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
c900: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
c910: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c930: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
c940: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
c950: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
c960: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
c970: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
c980: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c990: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
c9a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
c9b0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c9c0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
c9d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
c9e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c9f0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
ca00: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
ca10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
ca20: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
ca30: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
ca40: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
ca50: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
ca60: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
ca70: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
ca80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
ca90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
caa0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
cab0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
cac0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
cad0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
cae0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
caf0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
cb00: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
cb10: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cb20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
cb30: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
cb40: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
cb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
cb60: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
cb70: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
cb80: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
cb90: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
cba0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
cbb0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
cbc0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
cbd0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
cbe0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
cbf0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
cc00: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
cc10: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
cc20: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
cc30: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
cc40: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
cc50: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
cc60: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
cc70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cc80: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
cc90: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
cca0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
ccb0: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
ccc0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
ccd0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
cce0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
ccf0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
cd00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
cd20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
cd50: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
cd60: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
cd70: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
cd80: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
cd90: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
cda0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
cdb0: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
cdc0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cdd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
cde0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
cdf0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
ce00: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ce10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ce20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ce30: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
ce40: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
ce50: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
ce60: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
ce70: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
ce80: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
ce90: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
cea0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
ceb0: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
cec0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
ced0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
cee0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
cef0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
cf00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
cf10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
cf20: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
cf30: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
cf40: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
cf50: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
cf60: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
cf70: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
cf80: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
cf90: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
cfa0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
cfb0: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
cfc0: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
cfd0: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
cfe0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cff0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d000: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d010: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d020: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d030: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d040: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d050: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d060: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d070: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d080: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d090: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d0a0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d0b0: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d0c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d0d0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d0e0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d0f0: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d110: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d120: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d130: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d140: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d150: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d160: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d170: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d180: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d190: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d1a0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
d1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d1c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d1d0: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
d1e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d1f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
d210: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
d220: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
d230: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
d240: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
d250: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
d260: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
d270: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
d280: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
d290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d2a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
d2b0: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
d2c0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
d2d0: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
d2e0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
d2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
d300: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
d310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d320: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
d330: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
d340: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
d350: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d360: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
d370: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
d380: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
d390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d3a0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
d3b0: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
d3c0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
d3d0: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
d3e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
d3f0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
d400: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
d410: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
d420: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
d430: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d440: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
d450: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
d460: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
d470: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d480: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
d490: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
d4a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
d4b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d4c0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
d4d0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
d4e0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
d4f0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d500: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
d510: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
d520: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
d530: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
d540: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d550: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
d560: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
d570: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
d580: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
d590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d5a0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
d5b0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
d5c0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
d5d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
d5e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d5f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
d600: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
d610: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d620: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d630: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
d640: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
d650: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
d660: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d670: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
d680: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
d690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d6a0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
d6b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d6c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d6d0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d6f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d700: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d710: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d720: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
d730: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d740: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d750: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d760: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d770: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d780: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d790: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d7a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
d7b0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
d7c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d7d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d800: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d810: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d820: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d830: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
d840: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
d850: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
d860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d870: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
d880: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
d890: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
d8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
d8b0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d8c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
d8d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
d8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
d8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d910: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d920: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
d930: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d940: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
d950: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
d960: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
d970: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
d980: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
d990: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
d9a0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
d9b0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
d9c0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
d9d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
d9e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9f0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
da00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
da10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
da20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
da30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
da40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
da50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
da60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
da70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
da80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
da90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
daa0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
dab0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
dac0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
dad0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
dae0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
db00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
db10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
db20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
db30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
db40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
db50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
db60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
db70: 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  an. */.  const c
db80: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
db90: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
dba0: 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   span */.  const
dbb0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
dbc0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
dbd0: 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71   span */.){.  sq
dbe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dbf0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
dc00: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
dc10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
dc20: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
dc30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
dc40: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *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 4c 69  .    assert( pLi
dc80: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
dc90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dca0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcb0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcc0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dcd0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
dce0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d  rt, zEnd);.  }.}
dcf0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd10: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd20: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd30: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dd40: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
dd50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
dd60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dd70: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dd80: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
dd90: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
dda0: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
ddb0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
ddc0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
ddd0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
dde0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
ddf0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de00: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de10: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de30: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
de40: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
de50: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
de60: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
de70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
de80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
de90: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
dea0: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
deb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
dec0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
ded0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dee0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
def0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df00: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df30: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
df40: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
df50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
df60: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
df90: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
dfa0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
dfb0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
dfc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dfd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
dfe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dff0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e000: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e010: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e020: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e030: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e040: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e050: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e060: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e070: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e080: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e090: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e0a0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e0b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e0c0: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e0d0: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e0e0: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e0f0: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e100: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e110: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e130: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e140: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e150: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e160: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e170: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e180: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e190: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e1a0: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e1b0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e1c0: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e1d0: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e1e0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e1f0: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e200: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e220: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e230: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e240: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e250: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e260: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e270: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e280: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e290: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e2a0: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e2b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e2c0: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e2d0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e2e0: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e2f0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e300: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e310: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e320: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e330: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e340: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
e360: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
e370: 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65 20   an ID with the 
e380: 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22  name "true" or "
e390: 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63  false".** then c
e3a0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
e3b0: 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74  n TK_TRUEFALSE t
e3c0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  erm.  Return non
e3d0: 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20  -zero if.** the 
e3e0: 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65  conversion happe
e3f0: 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66  ned, and zero if
e400: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e410: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f  is unaltered..*/
e420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e430: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78  IdToTrueFalse(Ex
e440: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73  pr *pExpr){.  as
e450: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e460: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d  =TK_ID || pExpr-
e470: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
e480: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
e490: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e4a0: 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d  zToken, "true")=
e4b0: 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  =0.   || sqlite3
e4c0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e4d0: 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22  .zToken, "false"
e4e0: 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45  )==0.  ){.    pE
e4f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
e500: 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75  EFALSE;.    retu
e510: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
e520: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
e530: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
e540: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
e550: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
e560: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
e570: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
e580: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
e590: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e5a0: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
e5b0: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
e5c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e5d0: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
e5e0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
e5f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e600: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
e610: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
e620: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e630: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e640: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
e650: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
e660: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
e670: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
e680: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
e690: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
e6a0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
e6b0: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
e6c0: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
e6d0: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
e6e0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
e6f0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
e700: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
e710: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
e720: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
e730: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
e740: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
e750: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
e760: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
e770: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
e780: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
e790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
e7a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e7b0: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
e7c0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e7d0: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
e7e0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e7f0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
e800: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e810: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
e820: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
e830: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
e840: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
e850: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
e860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
e870: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
e880: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
e890: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
e8a0: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
e8b0: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
e8c0: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
e8d0: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
e8e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e8f0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
e900: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
e910: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
e920: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
e930: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
e940: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
e950: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
e960: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
e970: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e980: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
e990: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
e9a0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
e9b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
e9c0: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
e9d0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
e9e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
e9f0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
ea00: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
ea10: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
ea20: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
ea30: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
ea40: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
ea50: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
ea60: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
ea70: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ea80: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
ea90: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
eaa0: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
eab0: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
eac0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
ead0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
eae0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
eaf0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
eb00: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
eb10: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
eb20: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
eb30: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
eb40: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
eb50: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
eb60: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
eb70: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
eb80: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
eb90: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
eba0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ebb0: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ebc0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ebd0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ebe0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
ebf0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
ec00: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
ec10: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
ec20: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
ec30: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ec40: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
ec50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ec60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ec70: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ec80: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ec90: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
eca0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ecb0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ecc0: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ecd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ece0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ecf0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ed00: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ed10: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ed20: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ed30: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ed40: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
ed50: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
ed60: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
ed70: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
ed80: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
ed90: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
eda0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
edb0: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
edc0: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
edd0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ede0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
edf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
ee00: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ee10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ee20: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ee30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ee40: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
ee50: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
ee60: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
ee70: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
ee80: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
ee90: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
eea0: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
eeb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
eec0: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
eed0: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
eee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
eef0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
ef00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ef10: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
ef20: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
ef30: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ef40: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
ef50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
ef60: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ef70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ef80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ef90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
efa0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
efb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
efc0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
efd0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
efe0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
eff0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
f000: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
f010: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
f020: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
f030: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
f040: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f050: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f070: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
f080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f  .    case TK_IF_
f090: 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61  NULL_ROW:.    ca
f0a0: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a  se TK_REGISTER:.
f0b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f0c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
f0d0: 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
f0e0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f0f0: 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
f100: 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61  ROW );.      pWa
f110: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f130: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73  C_Abort;.    cas
f140: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
f150: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f160: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
f170: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
f180: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
f190: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
f1a0: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
f1b0: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
f1c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
f1d0: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
f1e0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
f1f0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
f200: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
f210: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
f220: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
f230: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
f240: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
f250: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
f260: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
f270: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
f280: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
f290: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
f2a0: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
f2b0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
f2c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
f2d0: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
f2e0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
f2f0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f300: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f310: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f320: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f330: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f340: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f350: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f360: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f370: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
f380: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64  lectWalkFail() d
f390: 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20  isallows */.    
f3a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f3b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
f3c0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
f3d0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64  lectWalkFail() d
f3e0: 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20  isallows */.    
f3f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
f400: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
f410: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
f420: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
f430: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
f440: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
f450: 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e  ;.  w.eCode = in
f460: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
f470: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
f480: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
f490: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
f4a0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
f4b0: 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
f4c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
f4d0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
f4e0: 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
f4f0: 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
f500: 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69  ;.#endif.  w.u.i
f510: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
f520: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
f530: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
f540: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
f550: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
f560: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
f570: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
f580: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f590: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
f5a0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
f5b0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
f5c0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
f5d0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
f5e0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
f5f0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
f600: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
f610: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
f620: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
f630: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
f640: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
f650: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
f660: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
f670: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f680: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
f690: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
f6a0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
f6b0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
f6c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
f6d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
f6e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
f6f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
f700: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
f710: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
f720: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
f730: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
f740: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
f750: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
f760: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
f770: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
f780: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
f790: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
f7a0: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
f7b0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f7c0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
f7d0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
f7e0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
f7f0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
f800: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f810: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f820: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f830: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f840: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
f850: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
f860: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
f870: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
f880: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
f890: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
f8a0: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
f8b0: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
f8c0: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
f8d0: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
f8e0: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
f8f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f900: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
f910: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
f920: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
f930: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
f940: 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iCur);.}.../*.*
f950: 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  * sqlite3WalkExp
f960: 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  r() callback use
f970: 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
f980: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
f990: 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pBy()..*/.static
f9a0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
f9b0: 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
f9c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
f9d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
f9e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
f9f0: 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  upBy = pWalker->
fa00: 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e  u.pGroupBy;.  in
fa10: 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  t i;..  /* Check
fa20: 20 69 66 20 70 45 78 70 72 20 69 73 20 69 64 65   if pExpr is ide
fa30: 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52  ntical to any GR
fa40: 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20  OUP BY term. If 
fa50: 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a  so, consider.  *
fa60: 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20  * it constant.  
fa70: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
fa80: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
fa90: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
faa0: 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  *p = pGroupBy->a
fab0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
fac0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
fad0: 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20  mpare(0, pExpr, 
fae0: 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20  p, -1)<2 ){.    
faf0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
fb00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
fb10: 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d  CollSeq(pWalker-
fb20: 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  >pParse, p);.   
fb30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
fb40: 74 72 69 63 6d 70 28 22 42 49 4e 41 52 59 22 2c  tricmp("BINARY",
fb50: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d   pColl->zName)==
fb60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
fb70: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
fb80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fb90: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
fba0: 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
fbb0: 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
fbc0: 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
fbd0: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
fbe0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
fbf0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
fc00: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
fc10: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
fc20: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fc30: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
fc40: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
fc50: 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
fc60: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
fc70: 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
fc80: 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
fc90: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
fca0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
fcb0: 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
fcc0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
fcd0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
fce0: 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
fcf0: 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
fd00: 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
fd10: 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
fd20: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
fd30: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
fd40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fd50: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
fd60: 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
fd70: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
fd80: 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
fd90: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
fda0: 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
fdb0: 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
fdc0: 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
fdd0: 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
fde0: 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
fdf0: 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
fe00: 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
fe10: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
fe20: 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
fe30: 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
fe40: 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
fe50: 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
fe60: 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
fe70: 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
fe80: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
fe90: 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
fea0: 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
feb0: 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
fec0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
fed0: 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
fee0: 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
fef0: 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
ff00: 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
ff10: 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
ff20: 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
ff30: 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
ff40: 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
ff50: 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
ff60: 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
ff70: 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
ff80: 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
ff90: 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
ffa0: 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
ffb0: 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
ffc0: 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
ffd0: 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
ffe0: 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
fff0: 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10000 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10010 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10020 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10030 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10040 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10050 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10060 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10070 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10080 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10090 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
100a0 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
100b0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
100c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
100d0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
100e0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
100f0 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10100 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10110 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10120 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10130 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10140 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10150 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10160 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10170 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10180 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10190 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
101a0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
101b0 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
101c0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
101d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
101e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
101f0 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10200 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10210 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10220 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10230 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10240 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10250 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10260 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10270 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10280 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10290 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
102a0 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
102b0 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
102c0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
102d0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
102e0 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
102f0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10300 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
10310 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10330 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
10340 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
10350 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
10360 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
10370 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
10380 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10390 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
103a0 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
103b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
103c0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
103d0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
103e0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
103f0 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
10400 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
10410 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
10420 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
10430 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
10440 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
10450 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10460 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
10470 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
10480 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
10490 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
104a0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
104b0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
104c0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
104d0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
104e0 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
104f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10500 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
10510 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
10520 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
10530 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
10540 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10550 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10560 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
10570 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
10580 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
10590 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
105a0 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
105b0 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
105c0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
105d0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
105e0 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
105f0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
10600 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
10610 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
10620 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
10630 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
10640 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
10650 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
10660 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
10670 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
10680 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
10690 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
106a0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
106b0 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
106c0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
106d0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
106e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
106f0 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
10700 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
10710 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
10720 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
10730 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
10740 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
10750 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
10760 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
10770 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
10780 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
10790 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
107a0 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
107b0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
107c0 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
107d0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
107e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
107f0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
10800 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
10810 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
10820 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
10830 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
10840 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
10850 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
10860 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
10870 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
10880 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
10890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108a0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
108b0 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
108c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
108d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
108e0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
108f0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
10900 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
10910 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
10920 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
10930 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
10940 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
10950 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
10960 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
10970 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10990 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
109a0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
109b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
109c0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
109d0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
109e0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
109f0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
10a00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
10a10 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
10a20 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
10a30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
10a40 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
10a50 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
10a60 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
10a70 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
10a80 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
10a90 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
10aa0 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
10ab0 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
10ac0 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
10ad0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
10ae0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
10af0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
10b00 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
10b10 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
10b20 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
10b30 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
10b40 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
10b50 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
10b60 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
10b70 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
10b80 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
10b90 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
10ba0 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
10bb0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
10bc0 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
10bd0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
10be0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
10bf0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
10c00 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
10c10 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
10c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10c30 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
10c40 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
10c50 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
10c60 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
10c70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
10c80 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
10c90 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
10ca0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
10cb0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
10cc0 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
10cd0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
10ce0 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
10cf0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
10d00 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
10d10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
10d20 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
10d30 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
10d40 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65  COLUMN:.      re
10d50 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
10d60 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
10d70 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
10d80 20 20 20 20 20 20 70 2d 3e 70 54 61 62 3d 3d 30        p->pTab==0
10d90 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63   ||  /* Referenc
10da0 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  e to column of i
10db0 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69  ndex on expressi
10dc0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
10dd0 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
10de0 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43  0 && p->pTab->aC
10df0 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e  ol[p->iColumn].n
10e00 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20  otNull==0);.    
10e10 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
10e20 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
10e30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10e40 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  E if the given e
10e50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
10e60 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f  onstant which wo
10e70 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e  uld be.** unchan
10e80 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69  ged by OP_Affini
10e90 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69  ty with the affi
10ea0 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68  nity given in th
10eb0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
10ec0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ment..**.** This
10ed0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
10ee0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
10ef0 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
10f00 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
10f10 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57  n be omitted.  W
10f20 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74  hen in doubt ret
10f30 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61  urn FALSE.  A fa
10f40 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  lse negative.** 
10f50 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20  is harmless.  A 
10f60 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20  false positive, 
10f70 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73  however, can res
10f80 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  ult in the wrong
10f90 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69  .** answer..*/.i
10fa0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  nt sqlite3ExprNe
10fb0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
10fc0 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  nge(const Expr *
10fd0 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20  p, char aff){.  
10fe0 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66  u8 op;.  if( aff
10ff0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
11000 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
11010 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
11020 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
11030 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
11040 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
11050 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
11060 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
11070 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
11080 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
11090 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
110a0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  EGER: {.      re
110b0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
110c0 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
110d0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
110e0 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
110f0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
11100 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
11110 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11120 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51  _REAL || aff==SQ
11130 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
11140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11150 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
11160 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11170 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
11180 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11190 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
111a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
111b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
111c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  UMN: {.      ass
111d0 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d  ert( p->iTable>=
111e0 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f  0 );  /* p canno
111f0 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43  t be part of a C
11200 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
11210 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
11220 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20  p->iColumn<0.   
11230 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
11240 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
11250 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
11260 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a  E_AFF_NUMERIC);.
11270 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
11280 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t: {.      retur
11290 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n 0;.    }.  }.}
112a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
112b0 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
112c0 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
112d0 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
112e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
112f0 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
11300 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
11310 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
11320 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
11330 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
11340 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
11350 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
11360 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
11370 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
11380 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
11390 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
113a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69  0;.}../*.** pX i
113b0 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20  s the RHS of an 
113c0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
113d0 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20   pX is a SELECT 
113e0 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68  statement .** th
113f0 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69  at can be simpli
11400 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74  fied to a direct
11410 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74   table access, t
11420 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  hen return.** a 
11430 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53  pointer to the S
11440 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
11450 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61    If pX is not a
11460 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11470 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  t,.** or if the 
11480 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11490 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e   needs to be man
114a0 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74  ifested into a t
114b0 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c  ransient.** tabl
114c0 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e  e, then return N
114d0 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ULL..*/.#ifndef 
114e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
114f0 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65  UERY.static Sele
11500 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46  ct *isCandidateF
11510 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58  orInOpt(Expr *pX
11520 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  ){.  Select *p;.
11530 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
11540 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
11550 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
11560 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
11570 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
11580 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
11590 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  lect) ) return 0
115a0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71  ;  /* Not a subq
115b0 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78  uery */.  if( Ex
115c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
115d0 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
115e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
115f0 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   Correlated subq
11600 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e   */.  p = pX->x.
11610 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70  pSelect;.  if( p
11620 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
11630 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11640 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
11650 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
11660 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
11670 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
11680 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
11690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
116a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
116b0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
116c0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
116d0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
116e0 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
116f0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
11700 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
11710 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
11720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
11730 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
11740 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
11750 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11760 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
11770 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
11780 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11790 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
117a0 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
117b0 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
117c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
117d0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
117e0 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
117f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
11800 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
11810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
11820 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
11830 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
11840 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
11850 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
11860 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
11870 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11880 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
11890 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
118a0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
118b0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
118c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
118d0 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
118e0 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
118f0 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
11900 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
11910 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
11920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
11930 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
11940 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11950 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
11960 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
11970 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
11980 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
11990 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
119a0 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
119b0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
119c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
119d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
119e0 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c  st!=0 );.  /* Al
119f0 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  l SELECT results
11a00 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73   must be columns
11a10 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
11a20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
11a30 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
11a40 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRes = pEList->
11a50 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11a60 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b  if( pRes->op!=TK
11a70 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
11a80 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
11a90 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  pRes->iTable==pS
11aa0 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
11ab0 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f   );  /* Not a co
11ac0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
11ad0 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  y */.  }.  retur
11ae0 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n p;.}.#endif /*
11af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11b00 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
11b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
11b20 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
11b30 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
11b40 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d  checks the left-
11b50 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  most column of i
11b60 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20  ndex table iCur 
11b70 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20  to see if.** it 
11b80 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
11b90 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73  L entries.  Caus
11ba0 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  e the register a
11bb0 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20  t regHasNull to 
11bc0 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e  be set.** to a n
11bd0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
11be0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e   iCur contains n
11bf0 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20  o NULLs.  Cause 
11c00 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e  register regHasN
11c10 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74  ull.** to be set
11c20 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72   to NULL if iCur
11c30 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
11c40 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
11c50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11c60 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e  d sqlite3SetHasN
11c70 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c  ullFlag(Vdbe *v,
11c80 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72   int iCur, int r
11c90 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e  egHasNull){.  in
11ca0 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74  t addr1;.  sqlit
11cb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11cc0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
11cd0 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64  egHasNull);.  ad
11ce0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
11cf0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
11d00 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62  wind, iCur); Vdb
11d10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d30 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
11d40 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  iCur, 0, regHasN
11d50 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ull);.  sqlite3V
11d60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11d70 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
11d80 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11d90 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79  (v, "first_entry
11da0 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29  _in(%d)", iCur))
11db0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
11dc0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
11dd0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
11de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11df0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11e00 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
11e10 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
11e20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
11e30 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
11e40 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
11e50 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
11e60 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
11e70 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
11e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
11e90 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
11ea0 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
11eb0 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
11ec0 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
11ed0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11ee0 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
11ef0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
11f00 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
11f10 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
11f20 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
11f30 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
11f40 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
11f50 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
11f60 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
11f70 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
11f80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
11f90 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
11fa0 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
11fb0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
11fc0 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
11fd0 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
11fe0 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
11ff0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12000 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
12010 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
12020 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
12030 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
12040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
12050 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
12060 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
12070 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
12080 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
12090 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
120a0 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
120b0 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
120c0 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
120d0 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
120e0 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
120f0 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
12100 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
12110 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
12120 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
12130 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
12140 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
12150 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12160 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
12170 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
12180 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
12190 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
121a0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
121b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
121c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
121d0 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
121e0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
121f0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
12200 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12210 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12220 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
12230 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
12240 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
12250 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
12260 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
12270 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
12280 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
12290 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
122a0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
122b0 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
122c0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
122d0 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
122e0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
122f0 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
12300 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
12330 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
12340 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
12350 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
12360 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
12370 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
12380 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
12390 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
123a0 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
123b0 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
123c0 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
123d0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
123e0 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
123f0 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
12400 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
12410 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
12420 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
12430 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
12440 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e  SELECT <column1>
12450 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46  , <column2>... F
12460 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
12470 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
12480 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
12490 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d  is a list or a m
124a0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71  ore complex subq
124b0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  uery, then.** an
124c0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
124d0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
124e0 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
124f0 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
12500 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20  n.** pX->iTable 
12510 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
12520 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
12530 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
12540 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
12550 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
12560 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  inFlags paramete
12570 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20  r must contain, 
12580 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e  at a minimum, on
12590 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a  e of the bits.**
125a0 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
125b0 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58  SHIP or IN_INDEX
125c0 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f  _LOOP but not bo
125d0 74 68 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  th.  If inFlags 
125e0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
125f0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
12600 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
12610 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
12620 65 20 75 73 65 64 20 66 6f 72 20 61 20 66 61 73  e used for a fas
12630 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20  t.** membership 
12640 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
12650 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
12660 74 20 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e  t is set, the IN
12670 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62   index will.** b
12680 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
12690 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
126a0 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
126b0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
126c0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
126d0 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
126e0 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
126f0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
12700 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
12710 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
12720 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
12730 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
12740 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
12750 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
12760 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72  table will be cr
12770 65 61 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65  eated unless the
12780 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
12790 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
127a0 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
127b0 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
127c0 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
127d0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
127e0 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e  r due to.** a UN
127f0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
12800 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  or index..**.** 
12810 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
12820 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
12830 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
12840 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
12850 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
12860 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
12870 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
12880 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
12890 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
128a0 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20   <columns> is a 
128b0 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50  single INTEGER P
128c0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
128d0 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65  n or an .** inde
128e0 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77  x can be found w
128f0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
12900 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69  d <columns> as i
12910 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a  ts left-most..**
12920 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
12930 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
12940 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
12950 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
12960 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
12970 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12980 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
12990 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
129a0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
129b0 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
129c0 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
129d0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
129e0 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
129f0 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
12a00 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
12a10 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
12a20 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
12a30 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
12a40 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
12a50 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
12a60 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12a70 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
12a80 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
12a90 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
12aa0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
12ab0 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
12ac0 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
12ad0 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
12ae0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
12af0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
12b00 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
12b10 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
12b20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
12b30 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
12b40 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
12b50 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
12b60 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
12b70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
12b80 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
12b90 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
12ba0 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
12bb0 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
12bc0 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
12bd0 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
12be0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
12bf0 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
12c00 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
12c10 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
12c20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
12c30 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
12c40 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
12c50 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
12c60 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
12c70 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
12c80 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
12c90 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
12ca0 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
12cb0 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
12cc0 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
12cd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
12ce0 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
12cf0 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
12d00 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
12d10 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
12d20 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
12d30 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
12d40 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
12d50 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
12d60 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
12d70 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
12d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69  .**.** If the ai
12d90 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73  Map parameter is
12da0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75   not NULL, it mu
12db0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61  st point to an a
12dc0 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  rray containing.
12dd0 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66  ** one element f
12de0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72  or each column r
12df0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
12e00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12e10 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66  on the RHS.** of
12e20 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65   the IN(...) ope
12e30 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20  rator. The i'th 
12e40 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72  entry of the arr
12e50 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ay is populated 
12e60 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73  with the.** offs
12e70 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  et of the index 
12e80 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63  column that matc
12e90 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c  hes the i'th col
12ea0 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
12eb0 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46  the.** SELECT. F
12ec0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
12ed0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
12ee0 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  d selected index
12ef0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f   are:.**.**   (?
12f00 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  ,?,?) IN (SELECT
12f10 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
12f20 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  ).**   CREATE IN
12f30 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20  DEX i1 ON t1(b, 
12f40 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  c, a);.**.** the
12f50 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70  n aiMap[] is pop
12f60 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20  ulated with {2, 
12f70 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  0, 1}..*/.#ifnde
12f80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
12f90 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
12fa0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20  e3FindInIndex(. 
12fb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12fd0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12fe0 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20  /.  Expr *pX,   
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13000 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
13010 20 73 69 64 65 20 28 52 48 53 29 20 6f 66 20 74   side (RHS) of t
13020 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
13030 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c  /.  u32 inFlags,
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13050 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  * IN_INDEX_LOOP,
13060 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e   _MEMBERSHIP, an
13070 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f  d/or _NOOP_OK */
13080 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73  .  int *prRhsHas
13090 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  Null,         /*
130a0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
130b0 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20  g NULL status.  
130c0 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69  See notes */.  i
130d0 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20  nt *aiMap       
130e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
130f0 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20  ping from Index 
13100 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69  fields to RHS fi
13110 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  elds */.){.  Sel
13120 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
13150 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
13160 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
13170 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
131a0 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
131b0 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
131c0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
131d0 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
131e0 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
131f0 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
13200 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13220 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13230 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
13240 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
13250 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13260 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
13270 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
13280 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
13290 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
132a0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
132b0 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
132c0 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
132d0 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
132e0 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
132f0 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  this IN(...) ope
13300 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43  rator is a SELEC
13310 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74  T, and if it mat
13320 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68  ters .  ** wheth
13330 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45  er or not the SE
13340 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74  LECT result cont
13350 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
13360 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a  , check whether.
13370 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c    ** or not NULL
13380 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
13390 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f  sible (it may no
133a0 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  t be, for exampl
133b0 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20  e, due .  ** to 
133c0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
133d0 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ints in the sche
133e0 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20  ma). If no NULL 
133f0 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69  values are possi
13400 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72  ble,.  ** set pr
13410 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20  RhsHasNull to 0 
13420 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
13430 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52  g.  */.  if( prR
13440 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58  hsHasNull && (pX
13450 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
13460 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
13470 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
13480 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d  st *pEList = pX-
13490 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
134a0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
134b0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
134c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
134d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
134e0 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61  BeNull(pEList->a
134f0 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65  [i].pExpr) ) bre
13500 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
13510 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  ( i==pEList->nEx
13520 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68  pr ){.      prRh
13530 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  sHasNull = 0;.  
13540 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
13550 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
13560 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
13570 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
13580 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
13590 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
135a0 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
135b0 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
135c0 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
135d0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
135e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
135f0 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d  >nErr==0 && (p =
13600 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13610 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a  nOpt(pX))!=0 ){.
13620 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
13630 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
13650 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13660 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
13670 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
136a0 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  . */.    i16 iDb
136b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
136e0 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  for pTab */.    
136f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
13700 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
13710 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45    int nExpr = pE
13720 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
13730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13740 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
13750 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
13760 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
13770 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
13780 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13790 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
137a0 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
137b0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
137c0 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
137d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
137e0 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
137f0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
13800 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
13810 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
13820 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
13830 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
13840 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
13850 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
13860 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
13870 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
13880 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13890 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
138a0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
138b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
138c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
138d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
138e0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
138f0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
13900 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
13910 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73  >zName);..    as
13920 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c  sert(v);  /* sql
13930 69 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61  ite3GetVdbe() ha
13940 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72  s always been pr
13950 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
13960 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72  */.    if( nExpr
13970 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
13980 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
13990 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mn<0 ){.      /*
139a0 20 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45   The "x IN (SELE
139b0 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61  CT rowid FROM ta
139c0 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20  ble)" case */.  
139d0 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
139e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
139f0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20  0(v, OP_Once);. 
13a00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
13a10 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
13a20 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
13a30 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
13a40 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
13a50 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
13a60 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
13a70 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
13a80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13a90 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
13aa0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
13ab0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ad0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
13ae0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
13af0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
13b00 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
13b10 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
13b20 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
13b30 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
13b40 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
13b50 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
13b60 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
13b70 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
13b80 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
13b90 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
13ba0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
13bb0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13bc0 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
13bd0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
13be0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
13bf0 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
13c00 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
13c10 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
13c20 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
13c30 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
13c40 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
13c50 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
13c60 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
13c70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
13c80 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
13c90 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
13ca0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
13cb0 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
13cc0 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
13cd0 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
13ce0 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
13cf0 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
13d00 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
13d10 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
13d20 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
13d30 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
13d40 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
13d50 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
13d60 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
13d70 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
13d80 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
13d90 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
13da0 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
13db0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
13dc0 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
13dd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13de0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
13df0 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
13e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
13e10 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13e20 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
13e30 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
13e40 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
13e50 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
13e60 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
13e70 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
13e80 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
13e90 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
13ea0 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
13eb0 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
13ec0 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
13ed0 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
13ee0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
13ef0 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
13f00 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
13f10 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
13f20 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
13f30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13f40 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
13f50 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
13f60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f70 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
13f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
13f90 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
13fa0 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
13fb0 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
13fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
13fd0 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
13fe0 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
13ff0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
14000 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
14010 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
14020 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
14030 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
14040 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
14050 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
14060 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
14070 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14080 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
14090 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
140a0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
140b0 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
140c0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
140d0 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
140e0 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
140f0 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
14100 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14110 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
14120 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14130 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
14140 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d   nColumn is BMS-
14150 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f  2, not BMS-1, so
14160 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d   that we can com
14170 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  pute.          *
14180 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29  * BITMASK(nExpr)
14190 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f   without overflo
141a0 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  wing */.        
141b0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
141c0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32  ->nColumn==BMS-2
141d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
141e0 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
141f0 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a  olumn==BMS-1 );.
14200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
14210 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53  dx->nColumn>=BMS
14220 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  -1 ) continue;. 
14230 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73           if( mus
14240 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20  tBeUnique ){.   
14250 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
14260 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72  x->nKeyCol>nExpr
14270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
14280 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
14290 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75  Expr && !IsUniqu
142a0 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20  eIndex(pIdx)).  
142b0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
142c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
142d0 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e  nue;  /* This in
142e0 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  dex is not uniqu
142f0 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48  e over the IN RH
14300 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  S columns */.   
14310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14320 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
14330 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b      colUsed = 0;
14340 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14350 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66   index used so f
14360 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ar */.          
14370 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
14380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14390 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
143a0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
143b0 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
143c0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
143d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73        Expr *pRhs
143e0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
143f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
14400 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
14410 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
14420 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
14430 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68  Parse, pLhs, pRh
14440 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
14450 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20  int j;.  .      
14460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
14470 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69  eq!=0 || pRhs->i
14480 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
14490 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
144a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
144b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  for(j=0; j<nExpr
144c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
144d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
144e0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68  aiColumn[j]!=pRh
144f0 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  s->iColumn ) con
14500 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
14510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14520 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a  x->azColl[j] );.
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14540 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c  ( pReq!=0 && sql
14550 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
14560 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
14570 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a  zColl[j])!=0 ){.
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
145a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
145b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
145c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
145d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
145e0 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  nExpr ) break;. 
145f0 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20             mCol 
14600 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20  = MASKBIT(j);.  
14610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43            if( mC
14620 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62  ol & colUsed ) b
14630 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f  reak; /* Each co
14640 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f  lumn used only o
14650 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nce */.         
14660 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43     colUsed |= mC
14670 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
14680 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61  if( aiMap ) aiMa
14690 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  p[i] = j;.      
146a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
146b0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45     assert( i==nE
146c0 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d  xpr || colUsed!=
146d0 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
146e0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1) );.          
146f0 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41  if( colUsed==(MA
14700 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
14710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
14720 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
14730 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
14740 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70  eans the index p
14750 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f  Idx is usable */
14760 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
14770 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
14780 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14790 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
147a0 72 61 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66  rage(v);.#ifndef
147b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
147c0 4c 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LAIN.           
147d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
147e0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
147f0 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
14800 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14810 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49  MPrintf(db, "USI
14820 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20  NG INDEX %s FOR 
14830 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64  IN-OPERATOR",pId
14840 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
14850 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41           P4_DYNA
14860 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  MIC);.#endif.   
14870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14880 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14890 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
148a0 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
148b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
148c0 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
148d0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
148e0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
148f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14900 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
14910 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
14920 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
14930 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
14940 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
14950 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
14960 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
14970 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
14980 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   + pIdx->aSortOr
14990 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20  der[0];.  .     
149a0 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73         if( prRhs
149b0 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65  HasNull ){.#ifde
149c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
149d0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
149e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
149f0 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45  64 mask = (1<<nE
14a00 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20  xpr)-1;.        
14a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14a20 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
14a30 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a  P_ColumnsUsed, .
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75    iTab, 0, 0, (u
14a60 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54  8*)&mask, P4_INT
14a70 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
14a80 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
14a90 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
14aa0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
14ab0 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70          if( nExp
14ac0 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r==1 ){.        
14ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
14ae0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
14af0 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73   iTab, *prRhsHas
14b00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
14b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14b30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14b40 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
14b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14b60 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f      } /* End loo
14b70 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a  p over indexes *
14b80 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64  /.      } /* End
14b90 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b   if( affinity_ok
14ba0 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45   ) */.    } /* E
14bb0 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77  nd if not an row
14bc0 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20  id index */.  } 
14bd0 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74  /* End attempt t
14be0 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67  o optimize using
14bf0 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   an index */..  
14c00 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73  /* If no preexis
14c10 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76  ting index is av
14c20 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
14c30 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61  IN clause.  ** a
14c40 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  nd IN_INDEX_NOOP
14c50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72   is an allowed r
14c60 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eply.  ** and th
14c70 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
14c80 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
14c90 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65  st, not a subque
14ca0 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ry.  ** and the 
14cb0 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  RHS is not const
14cc0 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
14cd0 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
14ce0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
14cf0 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
14d00 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
14d10 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
14d20 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
14d30 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
14d40 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
14d50 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
14d60 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
14d70 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
14d80 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
14d90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
14da0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
14db0 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
14dc0 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
14dd0 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
14de0 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
14df0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
14e00 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
14e10 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
14e20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
14e30 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
14e40 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
14e50 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
14e60 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
14e70 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
14e80 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
14e90 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14ea0 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
14eb0 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
14ec0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
14ed0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
14ee0 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
14ef0 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
14f00 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
14f10 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
14f20 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
14f30 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
14f40 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
14f50 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
14f60 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
14f70 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
14f80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
14f90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14fa0 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
14fb0 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14fd0 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
14fe0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
14ff0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
15000 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
15010 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
15020 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
15030 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
15040 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
15050 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
15060 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
15070 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
15080 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
15090 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
150a0 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
150b0 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69  = iTab;.  }..  i
150c0 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70  f( aiMap && eTyp
150d0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
150e0 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d  X_ASC && eType!=
150f0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
15100 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ESC ){.    int i
15110 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  , n;.    n = sql
15120 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
15130 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  ze(pX->pLeft);. 
15140 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
15150 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d   i++) aiMap[i] =
15160 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
15170 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
15180 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15190 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
151a0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
151b0 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
151c0 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
151d0 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
151e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
151f0 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
15200 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
15210 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
15220 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
15230 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
15240 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
15250 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
15260 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
15270 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15280 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
15290 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
152a0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
152b0 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
152c0 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
152d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
152e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
152f0 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
15300 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15310 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
15320 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
15330 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
15340 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
15350 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
15360 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
15370 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
15380 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
15390 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
153a0 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
153b0 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
153c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
153d0 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
153e0 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
153f0 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  MallocRaw(pParse
15400 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
15410 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
15420 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
15430 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
15440 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
15450 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
15460 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
15470 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
15480 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
15490 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
154a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
154b0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
154c0 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
154d0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
154e0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
154f0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
15500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15510 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
15520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15530 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
15540 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
15550 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
15560 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
15570 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
15580 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
15590 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
155a0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
155b0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
155c0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
155d0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
155e0 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
155f0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
15600 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
15610 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
15620 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
15630 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
15640 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
15650 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
15660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
15670 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
15680 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
15690 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
156a0 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
156b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
156c0 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
156d0 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
156e0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
156f0 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63  n pExpr is a vec
15700 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65  tor that has bee
15710 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  n used in a cont
15720 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ext where.** it 
15730 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
15740 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  . If pExpr is a 
15750 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f  sub-select vecto
15760 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
15770 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61  .** loads the Pa
15780 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20  rse object with 
15790 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  a message of the
157a0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
157b0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
157c0 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
157d0 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a  xpected 1".**.**
157e0 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20   Or, if it is a 
157f0 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76  regular scalar v
15800 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ector:.**.**   "
15810 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
15820 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  d".*/   .void sq
15830 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
15840 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
15850 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
15860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15870 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
15880 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
15890 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
158a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75  ){.    sqlite3Su
158b0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
158c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
158d0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
158e0 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Expr, 1);.  }els
158f0 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
15900 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15910 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
15920 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
15930 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15940 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
15950 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
15960 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
15970 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
15980 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
15990 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
159a0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
159b0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
159c0 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
159d0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
159e0 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
159f0 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
15a00 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
15a10 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
15a30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
15a40 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
15a50 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
15a60 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
15a70 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
15a80 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
15a90 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
15aa0 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
15ab0 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
15ac0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
15ad0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
15ae0 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
15af0 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
15b00 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
15b10 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
15b20 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
15b30 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
15b40 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
15b50 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
15b60 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
15b70 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
15b80 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
15b90 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
15ba0 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
15bb0 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
15bc0 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
15bd0 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
15be0 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
15bf0 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
15c00 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
15c10 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
15c20 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
15c30 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
15c40 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
15c50 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
15c60 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
15c70 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
15c80 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
15c90 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
15ca0 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
15cb0 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
15cc0 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
15cd0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
15ce0 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
15cf0 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
15d00 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
15d10 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
15d20 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
15d30 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
15d40 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
15d50 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
15d60 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
15d70 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
15d80 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
15d90 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
15da0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
15db0 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
15dc0 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
15dd0 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
15de0 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
15df0 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c  sult.  For a mul
15e00 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54  ti-column SELECT
15e10 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
15e20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74  stored in a cont
15e30 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20  iguous.** array 
15e40 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
15e50 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15e60 65 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65  e is the registe
15e70 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  r of the left-mo
15e80 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  st.** result col
15e90 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66  umn.  Return 0 f
15ea0 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  or IN operators 
15eb0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
15ec0 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ccurs..*/.#ifnde
15ed0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
15ee0 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
15ef0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
15f00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15f10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
15f20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15f30 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
15f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15f50 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72  e IN, SELECT, or
15f60 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
15f70 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75   */.  int rHasNu
15f80 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a  llFlag,       /*
15f90 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72   Register that r
15fa0 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e  ecords whether N
15fb0 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48  ULLs exist in RH
15fc0 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77  S */.  int isRow
15fd0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  id             /
15fe0 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f  * If true, LHS o
15ff0 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  f IN operator is
16000 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20   a rowid */.){. 
16010 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69   int jmpIfDynami
16020 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  c = -1;         
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16040 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
16050 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
16060 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
16090 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
160a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
160b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
160c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
160d0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
160e0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
160f0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
16100 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  rse);..  /* The 
16110 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
16120 65 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45  e IN/EXISTS/SELE
16130 43 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61  CT must be repea
16140 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69  ted every time i
16150 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e  t.  ** is encoun
16160 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20  tered if any of 
16170 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
16180 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
16190 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
161a0 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
161b0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
161c0 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
161d0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
161e0 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
161f0 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
16200 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
16210 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
16220 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
16230 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
16240 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
16250 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
16260 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
16270 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
16280 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
16290 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
162a0 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
162b0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
162c0 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
162d0 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
162e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
162f0 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
16300 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
16310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16320 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
16330 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16340 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16350 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16360 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
16370 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
16380 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
16390 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
163a0 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
163b0 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
163c0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d   %d",.        jm
163d0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
163e0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
163f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
16400 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
16410 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20  "SCALAR",.      
16420 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53    pParse->iNextS
16430 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
16440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16450 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
16460 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
16470 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
16480 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
16490 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
164a0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
164b0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
164c0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
164d0 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
164e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
164f0 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
16500 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
16510 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
16520 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
16530 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
16540 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16550 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65  ator */.      Ke
16560 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
16570 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
16580 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
16590 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20        int nVal; 
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
165c0 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20  tor pLeft */.   
165d0 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d     .      nVal =
165e0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
165f0 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
16600 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
16610 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31  Rowid || nVal==1
16620 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68   );..      /* Wh
16630 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
16640 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
16650 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
16660 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
16670 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
16680 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
16690 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
166a0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
166b0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
166c0 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b  led with index k
166d0 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
166e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
166f0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
16700 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
16710 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
16720 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
16730 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
16740 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
16750 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
16760 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
16770 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
16780 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
16790 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
167a0 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
167b0 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
167c0 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
167d0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
167e0 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
167f0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
16800 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
16810 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
16820 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
16830 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
16840 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16850 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16860 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16870 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
16880 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
16890 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
168a0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
168b0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
168c0 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
168d0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
168e0 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
168f0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
16900 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
16910 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
16940 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16950 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69  >iTable, (isRowi
16960 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20  d?0:nVal));.    
16970 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52    pKeyInfo = isR
16980 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74  owid ? 0 : sqlit
16990 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
169a0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
169b0 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
169c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
169d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
169e0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
169f0 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
16a00 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
16a10 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
16a20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
16a30 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
16a40 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
16a50 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
16a60 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
16a70 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
16a80 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
16a90 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
16aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
16ab0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
16ac0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
16ad0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
16ae0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
16af0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
16b00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
16b10 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
16b20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
16b30 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20   and RHS of the 
16b40 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e  IN operator do n
16b50 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20  ot match, that. 
16b60 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20         ** error 
16b70 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
16b80 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72  aught long befor
16b90 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  e we reach this 
16ba0 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
16bb0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
16bc0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
16bd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  ) ){.          S
16be0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
16bf0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
16c00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16c10 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
16c20 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
16c30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
16c40 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e  .          dest.
16c50 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
16c60 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
16c70 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
16c80 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
16c90 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
16cb0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
16cc0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
16cd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16ce0 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
16cf0 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
16d00 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
16d10 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
16d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
16d30 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16d40 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
16d50 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
16d60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16d70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
16d80 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
16d90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16da0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
16db0 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
16dc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16de0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16df0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
16e00 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
16e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16e20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
16e30 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
16e40 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
16e50 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
16e60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16e70 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
16e80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16e90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
16ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16eb0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
16ec0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
16ed0 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
16ee0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16ef0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
16f00 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
16f10 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
16f20 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
16f30 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
16f40 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
16f50 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
16f60 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
16f70 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20  lSeq(.          
16f80 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
16f90 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
16fa0 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
16fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16fd0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
16fe0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
16ff0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
17000 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
17010 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
17020 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
17030 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
17040 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
17050 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
17060 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
17070 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
17080 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
17090 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
170a0 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
170b0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
170c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
170d0 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
170e0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
170f0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
17100 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
17110 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
17120 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
17130 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
17140 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
17150 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
17160 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
17170 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
17180 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  the IN */.      
17190 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
171a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
171b0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
171c0 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
171d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
171e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
171f0 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
17200 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74  .        affinit
17210 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
17220 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
17230 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
17240 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
17250 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
17260 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
17270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17280 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17290 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
172a0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
172b0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
172c0 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
172d0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
172e0 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
172f0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
17300 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17310 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
17320 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
17330 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
17340 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
17350 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
17360 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17370 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17380 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
17390 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
173a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
173b0 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71  if( isRowid ) sq
173c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
173d0 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72  v, OP_Blob, 0, r
173e0 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41  2, 0, "", P4_STA
173f0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  TIC);.        fo
17400 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
17410 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
17420 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
17430 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
17440 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
17450 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
17460 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
17470 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
17480 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
17490 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
174a0 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
174b0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
174c0 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
174d0 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
174e0 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
174f0 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
17500 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
17510 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
17520 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
17530 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
17540 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
17550 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
17560 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
17570 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
17580 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
17590 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
175a0 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26  mpIfDynamic>=0 &
175b0 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
175c0 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
175d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
175e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
175f0 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Noop(v, jmpIfDyn
17600 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20  amic);.         
17610 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
17620 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
17630 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
17640 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
17650 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
17660 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
17670 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
17680 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17690 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
176a0 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
176b0 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
176c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
176d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
176e0 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
176f0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
17700 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
17710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
17720 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
17730 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
17740 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
17750 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
17760 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
17770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17790 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
177a0 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
177d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
177e0 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
177f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17800 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
17810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17820 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
17830 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17840 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
17850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17860 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17870 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17880 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
17890 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
178a0 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
178b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
178c0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
178d0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
178e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
178f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17900 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
17910 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
17920 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c  >iTable, r2, r3,
17930 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
17940 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
17950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17960 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17970 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17980 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17990 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
179a0 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
179b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
179c0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
179d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
179e0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
179f0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
17a00 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
17a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17a20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17a30 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
17a40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
17a50 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
17a60 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  : {.      /* Cas
17a70 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20  e 3:    (SELECT 
17a80 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
17a90 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20      **     or:  
17aa0 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20    EXISTS(SELECT 
17ab0 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
17ac0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17ad0 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
17ae0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
17af0 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
17b00 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
17b10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69  .      ** the fi
17b20 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  rst row into an 
17b30 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
17b40 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  rs and return th
17b50 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20  e index of.     
17b60 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
17b70 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  gister..      **
17b80 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
17b90 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
17ba0 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
17bb0 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
17bc0 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
17bd0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65      ** into a re
17be0 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72  gister and retur
17bf0 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
17c00 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a  number..      **
17c10 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74  .      ** In bot
17c20 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65  h cases, the que
17c30 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20  ry is augmented 
17c40 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20  with "LIMIT 1". 
17c50 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70   Any .      ** p
17c60 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
17c70 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
17c80 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
17c90 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20  w LIMIT 1..     
17ca0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
17cb0 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
17ce0 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
17cf0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
17d00 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
17d30 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a   SELECT result *
17d40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67  /.      int nReg
17d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d70 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   Registers to al
17d80 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20  locate */.      
17d90 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d        /* New lim
17dc0 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  it expression */
17dd0 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
17de0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17df0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
17e00 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
17e10 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
17e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
17e40 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
17e50 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
17e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
17e70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17e80 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
17e90 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
17ea0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
17eb0 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
17ec0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
17ed0 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
17ee0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
17ef0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
17f00 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17f10 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
17f20 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
17f30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
17f40 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
17f50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
17f60 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
17f70 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
17f80 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
17f90 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
17fa0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
17fb0 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
17fc0 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
17fd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17fe0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
17ff0 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
18000 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
18010 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
18020 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
18030 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
18040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18050 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
18060 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
18070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18090 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
180a0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
180b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
180c0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
180d0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
180e0 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74    }.      pLimit
180f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
18100 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
18110 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69  TK_INTEGER,&sqli
18120 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
18130 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
18140 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sel->pLimit ){. 
18150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18160 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
18170 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
18180 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  t->pLeft);.     
18190 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d     pSel->pLimit-
181a0 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b  >pLeft = pLimit;
181b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
181c0 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
181d0 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
181e0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d  r(pParse, TK_LIM
181f0 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a  IT, pLimit, 0);.
18200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
18210 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
18220 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
18230 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18240 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
18250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
18260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18270 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
18280 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
18290 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
182a0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
182b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
182c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
182d0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b   rHasNullFlag ){
182e0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48  .    sqlite3SetH
182f0 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45  asNullFlag(v, pE
18300 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61  xpr->iTable, rHa
18310 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a  sNullFlag);.  }.
18320 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61  .  if( jmpIfDyna
18330 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mic>=0 ){.    sq
18340 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18350 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  e(v, jmpIfDynami
18360 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  c);.  }.  sqlite
18370 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18380 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  arse);..  return
18390 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
183a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
183b0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
183c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
183d0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
183e0 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
183f0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
18400 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18410 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
18420 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
18430 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
18440 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
18450 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
18460 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
18470 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
18480 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
18490 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
184a0 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
184b0 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
184c0 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
184d0 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
184e0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
184f0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
18500 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18510 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
18520 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
18530 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
18540 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
18550 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
18560 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
18570 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
18580 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
18590 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
185a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
185b0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
185c0 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
185d0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
185e0 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
185f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
18600 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
18610 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
18620 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
18630 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18640 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
18650 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
18660 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
18670 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18690 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
186a0 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
186b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
186c0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
186d0 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
186e0 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
186f0 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
18700 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
18710 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
18720 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
18730 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
18740 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
18750 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
18760 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
18770 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
18780 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
18790 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
187a0 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
187b0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
187c0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
187d0 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
187e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
187f0 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
18800 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
18810 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
18820 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
18830 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
18840 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
18850 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
18860 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
18870 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
18880 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
18890 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
188a0 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
188b0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
188c0 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
188d0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
188e0 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
188f0 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
18900 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
18910 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
18920 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
18930 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
18940 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18950 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
18960 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
18970 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
18980 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
18990 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
189a0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
189b0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
189c0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
189d0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
189e0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
189f0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
18a00 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
18a10 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18a20 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
18a30 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
18a40 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
18a50 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
18a60 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
18a70 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
18a80 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
18a90 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
18aa0 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
18ab0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18ac0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
18ad0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
18ae0 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
18af0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18b00 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
18b10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18b20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
18b30 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18b40 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
18b50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
18b60 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
18b70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18b80 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
18b90 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
18ba0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
18bb0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
18bc0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
18bd0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
18be0 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
18bf0 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
18c00 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
18c10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
18c20 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
18c30 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
18c40 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
18c50 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
18c60 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
18c70 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
18c80 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
18c90 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
18ca0 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
18cb0 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
18cc0 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
18cd0 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
18ce0 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
18cf0 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
18d00 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18d10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
18d20 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
18d30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
18d40 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
18d50 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
18d60 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
18d70 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
18d80 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
18d90 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
18da0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
18db0 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
18dc0 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
18dd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18de0 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
18df0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
18e00 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
18e10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
18e20 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
18e30 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
18e40 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
18e50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
18e60 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
18e70 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
18e80 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18e90 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
18ea0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
18eb0 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
18ec0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
18ed0 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
18ee0 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
18ef0 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
18f00 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
18f10 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
18f20 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
18f30 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
18f40 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
18f50 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
18f60 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
18f70 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
18f80 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
18f90 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
18fa0 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
18fb0 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
18fc0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
18fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
18fe0 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
18ff0 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20  op */ ..  pLeft 
19000 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
19010 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19020 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c  rCheckIN(pParse,
19030 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
19040 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49  ;.  zAff = exprI
19050 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
19060 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63  , pExpr);.  nVec
19070 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
19080 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
19090 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
190a0 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
190b0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
190c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
190d0 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
190e0 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
190f0 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
19100 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19110 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19120 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19130 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
19140 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  r;..  /* Attempt
19150 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
19160 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
19170 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
19180 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
19190 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
191a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
191b0 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74   table opened it
191c0 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e  h cursor pExpr->
191d0 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e  iTable .  ** con
191e0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
191f0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
19200 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44  e RHS. If IN_IND
19210 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
19220 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48  ned,.  ** the RH
19230 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  S has not yet be
19240 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20  en coded.  */.  
19250 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19260 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
19270 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
19280 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
19290 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
192a0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
192b0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
192c0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
192d0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
192e0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
192f0 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  , pExpr,.       
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d        IN_INDEX_M
19320 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49  EMBERSHIP | IN_I
19330 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20  NDEX_NOOP_OK,.  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49             destI
19360 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
19370 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61  ll ? 0 : &rRhsHa
19380 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a  sNull, aiMap);..
19390 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
193a0 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f  ->nErr || nVecto
193b0 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49  r==1 || eType==I
193c0 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20  N_INDEX_EPH.    
193d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f     || eType==IN_
193e0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
193f0 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19400 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20  EX_INDEX_DESC . 
19410 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
19420 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e  E_DEBUG.  /* Con
19430 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b  firm that aiMap[
19440 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74  ] contains nVect
19450 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  or integer value
19460 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a  s between 0 and.
19470 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20    ** nVector-1. 
19480 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19490 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
194a0 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20     int j, cnt;. 
194b0 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20     for(cnt=j=0; 
194c0 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20  j<nVector; j++) 
194d0 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20  if( aiMap[j]==i 
194e0 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73  ) cnt++;.    ass
194f0 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20  ert( cnt==1 );. 
19500 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19510 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
19520 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
19530 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
19540 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61   If the LHS is a
19550 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74   .  ** vector, t
19560 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64  hen it is stored
19570 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
19580 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72  nVector register
19590 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a  s starting .  **
195a0 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a   at r1..  **.  *
195b0 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  * sqlite3FindInI
195c0 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76  ndex() might hav
195d0 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20  e reordered the 
195e0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48  fields of the LH
195f0 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f  S vector.  ** so
19600 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73   that the fields
19610 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65   are in the same
19620 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69   order as an exi
19630 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54  sting index.   T
19640 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20  he.  ** aiMap[] 
19650 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61  array contains a
19660 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
19670 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66  e original LHS f
19680 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20  ield order to.  
19690 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64  ** the field ord
196a0 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  er that matches 
196b0 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20  the RHS index.. 
196c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
196d0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
196e0 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d  e);.  rLhsOrig =
196f0 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
19700 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
19710 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69  iDummy);.  for(i
19720 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26  =0; i<nVector &&
19730 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b   aiMap[i]==i; i+
19740 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20  +){} /* Are LHS 
19750 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64  fields reordered
19760 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56  ? */.  if( i==nV
19770 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20  ector ){.    /* 
19780 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e  LHS fields are n
19790 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  ot reordered */.
197a0 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f      rLhs = rLhsO
197b0 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rig;.  }else{.  
197c0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f    /* Need to reo
197d0 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65  rder the LHS fie
197e0 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  lds according to
197f0 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c   aiMap */.    rL
19800 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  hs = sqlite3GetT
19810 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
19820 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66   nVector);.    f
19830 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19840 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
19850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19860 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68  (v, OP_Copy, rLh
19870 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69  sOrig+i, rLhs+ai
19880 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Map[i], 0);.    
19890 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
198a0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
198b0 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  x() did not find
198c0 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e   or create an in
198d0 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  dex that is.  **
198e0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76   suitable for ev
198f0 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20  aluating the IN 
19900 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65  operator, then e
19910 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a  valuate using a.
19920 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66    ** sequence of
19930 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20   comparisons..  
19940 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
19950 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20  step (1) in the 
19960 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f  in-operator.md o
19970 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74  ptimized algorit
19980 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  hm..  */.  if( e
19990 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e  Type==IN_INDEX_N
199a0 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  OOP ){.    ExprL
199b0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
199c0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
199d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
199e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
199f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
19a00 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19a10 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71  int labelOk = sq
19a20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19a30 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72  el(v);.    int r
19a40 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
19a50 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
19a60 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
19a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
19a80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19a90 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19aa0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
19ab0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
19ac0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
19ad0 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
19ae0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19af0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
19b00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19b10 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73   OP_BitAnd, rLhs
19b20 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c  , rLhs, regCkNul
19b30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
19b40 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
19b50 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
19b60 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
19b70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19b80 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
19b90 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
19ba0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
19bb0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
19bc0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
19bd0 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
19be0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
19bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19c00 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
19c10 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
19c20 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19c30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19c40 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
19c50 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
19c60 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
19c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19c80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19c90 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f  Eq, rLhs, labelO
19ca0 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
19cd0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
19ce0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19cf0 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
19d00 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
19d10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
19d20 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
19d30 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
19d40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19d50 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29  geP5(v, zAff[0])
19d60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
19d80 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
19d90 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20  fFalse );.      
19da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19db0 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
19dc0 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  hs, destIfFalse,
19dd0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19df0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
19e00 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
19e10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
19e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19e30 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
19e40 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ] | SQLITE_JUMPI
19e50 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
19e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19e70 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19e80 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
19e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
19ea0 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
19eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ec0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
19ed0 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
19ee0 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
19ef0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19f00 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
19f10 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
19f20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19f30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19f40 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a  el(v, labelOk);.
19f50 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19f60 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19f70 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19f80 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
19f90 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
19fa0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  d;.  }..  /* Ste
19fb0 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65  p 2: Check to se
19fc0 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e  e if the LHS con
19fd0 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63  tains any NULL c
19fe0 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a  olumns.  If the.
19ff0 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f    ** LHS does co
1a000 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e  ntain NULLs then
1a010 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1a020 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45   be either FALSE
1a030 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57   or NULL..  ** W
1a040 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70  e will then skip
1a050 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1a060 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ch of the RHS.. 
1a070 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1a080 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1a090 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65  e ){.    destSte
1a0a0 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  p2 = destIfFalse
1a0b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1a0c0 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53  estStep2 = destS
1a0d0 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  tep6 = sqlite3Vd
1a0e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a0f0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a100 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1a110 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
1a120 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1a130 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
1a140 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Left, i);.    if
1a150 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
1a160 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a180 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1a190 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53  l, rLhs+i, destS
1a1a0 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62  tep2);.      Vdb
1a1b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a1c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
1a1d0 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69  ep 3.  The LHS i
1a1e0 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62  s now known to b
1a1f0 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20  e non-NULL.  Do 
1a200 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1a210 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  h.  ** of the RH
1a220 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20  S using the LHS 
1a230 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20  as a probe.  If 
1a240 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c  found, the resul
1a250 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a  t is.  ** true..
1a260 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1a270 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a280 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
1a290 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
1a2a0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
1a2b0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
1a2c0 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20  d so we also.   
1a2d0 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   ** know that th
1a2e0 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c  e RHS is non-NUL
1a2f0 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f  L.  Hence, we co
1a300 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e  mbine steps 3 an
1a310 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  d 4.    ** into 
1a320 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
1a330 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1a340 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a350 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72  SeekRowid, pExpr
1a360 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a370 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1a380 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a390 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1a3a0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1a3b0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1a3c0 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1a3d0 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1a3e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a3f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1a400 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1a410 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1a420 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1a430 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1a440 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1a450 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1a460 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1a470 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1a480 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1a490 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a4a0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1a4b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a4c0 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20  destIfFalse,.   
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1a4f0 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1a500 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67  rage(v);.      g
1a510 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a520 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1a530 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64      }.    /* Ord
1a540 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f  inary Step 3, fo
1a550 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
1a560 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20   FALSE and NULL 
1a570 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
1a580 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1a590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a5a0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
1a5b0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a5c0 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a5f0 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a600 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1a610 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20  ..  /* Step 4.  
1a620 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e  If the RHS is kn
1a630 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1a640 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f  LL and we did no
1a650 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d  t find.  ** an m
1a660 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72  atch on the sear
1a670 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  ch above, then t
1a680 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1a690 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20  e FALSE..  */.  
1a6a0 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  if( rRhsHasNull 
1a6b0 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b  && nVector==1 ){
1a6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a6d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1a6e0 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
1a6f0 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  l, destIfFalse);
1a700 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a710 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
1a720 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64  Step 5.  If we d
1a730 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1a740 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1a750 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64  between NULL and
1a760 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65  .  ** FALSE, the
1a770 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61  n just return fa
1a780 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  lse. .  */.  if(
1a790 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1a7a0 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74  stIfNull ) sqlit
1a7b0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1a7c0 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f  stIfFalse);..  /
1a7d0 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74  * Step 6: Loop t
1a7e0 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74  hrough rows of t
1a7f0 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65  he RHS.  Compare
1a800 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65   each row to the
1a810 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e   LHS..  ** If an
1a820 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  y comparison is 
1a830 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
1a840 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  esult is NULL.  
1a850 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70  If all.  ** comp
1a860 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53  arisons are FALS
1a870 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c  E then the final
1a880 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45   result is FALSE
1a890 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
1a8a0 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74  a scalar LHS, it
1a8b0 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
1a8c0 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65  o check just the
1a8d0 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20   first row.  ** 
1a8e0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1a8f0 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36  .  if( destStep6
1a900 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
1a910 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1a920 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72  stStep6);.  addr
1a930 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1a940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1a950 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  wind, pExpr->iTa
1a960 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
1a970 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
1a980 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  e(v);.  if( nVec
1a990 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73  tor>1 ){.    des
1a9a0 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  tNotNull = sqlit
1a9b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a9c0 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
1a9d0 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d   /* For nVector=
1a9e0 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70  =1, combine step
1a9f0 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d  s 6 and 7 by imm
1aa00 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69  ediately returni
1aa10 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20  ng.    ** FALSE 
1aa20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d  if the first com
1aa30 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e  parison is not N
1aa40 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e  ULL */.    destN
1aa50 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46  otNull = destIfF
1aa60 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  alse;.  }.  for(
1aa70 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1aa80 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1aa90 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
1aaa0 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  pColl;.    int r
1aab0 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
1aac0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1aad0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65     p = sqlite3Ve
1aae0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1aaf0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
1ab00 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1ab10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1ab20 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, p);.    sqlit
1ab30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1ab40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
1ab50 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29  ->iTable, i, r3)
1ab60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ab70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1ab80 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1ab90 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1abc0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1abd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1abe0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1abf0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ac00 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1ac10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ac20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1ac30 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1ac40 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1ac50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ac60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1ac70 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1ac80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac90 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45  2(v, OP_Next, pE
1aca0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
1acb0 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62  rTop+1);.    Vdb
1acc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1acd0 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49     /* Step 7:  I
1ace0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1acf0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
1ad00 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hat the result m
1ad10 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61  ust.    ** be fa
1ad20 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lse. */.    sqli
1ad30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ad40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1ad50 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a  tIfFalse);.  }..
1ad60 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20    /* Jumps here 
1ad70 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75  in order to retu
1ad80 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71  rn true. */.  sq
1ad90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1ada0 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70  e(v, addrTruthOp
1adb0 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43  );..sqlite3ExprC
1adc0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a  odeIN_finished:.
1add0 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73    if( rLhs!=rLhs
1ade0 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65  Orig ) sqlite3Re
1adf0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1ae00 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71  rse, rLhs);.  sq
1ae10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1ae20 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62  p(pParse);.  Vdb
1ae30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
1ae40 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71  d IN expr"));.sq
1ae50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1ae60 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  oom_error:.  sql
1ae70 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1ae80 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20  e->db, aiMap);. 
1ae90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1aea0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29  Parse->db, zAff)
1aeb0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1aec0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1aed0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
1aee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1aef0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
1af00 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1af10 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1af20 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
1af30 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
1af40 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
1af50 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1af60 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1af70 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
1af80 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
1af90 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
1afa0 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
1afb0 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
1afc0 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
1afd0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
1afe0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
1aff0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
1b000 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
1b010 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
1b020 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1b030 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
1b040 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1b050 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
1b060 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
1b070 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
1b080 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
1b090 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
1b0a0 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
1b0b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
1b0c0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
1b0d0 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
1b0e0 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
1b0f0 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
1b100 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
1b110 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
1b120 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
1b130 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73   = -value;.    s
1b140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b150 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  Dup8(v, OP_Real,
1b160 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
1b170 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41  *)&value, P4_REA
1b180 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
1b190 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1b1a0 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1b1b0 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1b1c0 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
1b1d0 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
1b1e0 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1b1f0 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1b200 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
1b210 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
1b220 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
1b230 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1b240 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
1b250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1b260 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1b270 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
1b280 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
1b290 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1b2a0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1b2b0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1b2c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
1b2d0 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
1b2e0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
1b2f0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
1b300 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
1b310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b320 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1b330 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
1b340 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
1b350 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
1b360 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b370 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
1b380 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
1b390 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
1b3a0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1b3b0 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29  ToI64(z, &value)
1b3c0 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20  ;.    if( (c==3 
1b3d0 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20  && !negFlag) || 
1b3e0 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c  (c==2) || (negFl
1b3f0 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
1b400 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
1b410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1b420 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1b430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1b440 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b450 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
1b460 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
1b470 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
1b480 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
1b490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
1b4a0 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
1b4b0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
1b4c0 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
1b4d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b4e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b4f0 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
1b500 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
1b510 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
1b520 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
1b530 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1b540 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1b550 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
1b560 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
1b570 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1b580 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
1b590 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33   ){ value = c==3
1b5a0 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
1b5b0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
1b5c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b5d0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1b5e0 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
1b5f0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1b600 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
1b610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
1b620 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65  ase column-cache
1b630 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a   entry number i.
1b640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1b650 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
1b660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b670 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72  t i){.  if( pPar
1b680 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1b690 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  .tempReg ){.    
1b6a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1b6b0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
1b6c0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
1b6d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1b6e0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
1b6f0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
1b700 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1b710 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
1b720 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
1b730 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69  nColCache--;.  i
1b740 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i<pParse->nCo
1b750 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50  lCache ){.    pP
1b760 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b770 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
1b780 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e  lCache[pParse->n
1b790 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d  ColCache];.  }.}
1b7a0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
1b7b0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
1b7c0 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
1b7d0 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
1b7e0 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
1b7f0 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
1b800 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
1b810 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
1b820 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b830 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
1b840 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
1b850 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
1b860 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1b870 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
1b880 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
1b890 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1b8a0 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
1b8b0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
1b8c0 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
1b8d0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
1b8e0 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
1b8f0 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
1b900 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
1b910 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
1b920 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1b930 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1b940 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
1b950 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
1b960 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
1b970 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
1b980 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
1b990 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
1b9a0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
1b9b0 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
1b9c0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
1b9d0 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
1b9e0 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
1b9f0 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
1ba00 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
1ba10 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
1ba20 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
1ba30 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1ba40 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
1ba50 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1ba60 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
1ba70 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
1ba80 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
1ba90 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
1baa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
1bab0 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
1bac0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
1bad0 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
1bae0 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
1baf0 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1bb00 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
1bb10 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
1bb20 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
1bb30 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
1bb40 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1bb50 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
1bb60 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1bb70 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1bb80 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1bb90 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1bba0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
1bbb0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
1bbc0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
1bbd0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1bbe0 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1bbf0 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1bc00 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1bc10 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1bc20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1bc30 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1bc40 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1bc50 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1bc60 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1bc70 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1bc80 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1bc90 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1bca0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1bcb0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1bcc0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1bcd0 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1bce0 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1bcf0 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1bd00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bd10 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1bd20 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1bd30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1bd40 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1bd50 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1bd60 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1bd70 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1bd80 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1bd90 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1bda0 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1bdb0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1bdc0 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1bdd0 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1bde0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1bdf0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1be00 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1be10 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1be20 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1be30 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1be40 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1be50 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1be60 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1be70 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1be80 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1be90 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1bea0 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1beb0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1bec0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bed0 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1bee0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1bef0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1bf00 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1bf10 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1bf20 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1bf30 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1bf40 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1bf50 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1bf60 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1bf70 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1bf80 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1bf90 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1bfa0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1bfb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bfc0 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1bfd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1bfe0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1bff0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1c000 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1c010 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1c020 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1c030 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1c040 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1c050 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1c060 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1c070 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1c080 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c090 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1c0a0 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1c0b0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1c0c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c0d0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1c0e0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1c0f0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1c100 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1c110 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1c120 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1c130 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1c140 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1c150 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1c160 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1c170 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1c180 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1c190 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1c1a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c1b0 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1c1c0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1c1d0 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1c1e0 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1c1f0 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1c200 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1c210 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1c220 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c230 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1c240 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1c250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1c260 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1c270 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1c280 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1c290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c2a0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1c2b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1c2c0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1c2d0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1c2e0 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1c2f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1c300 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1c310 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1c320 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1c330 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1c340 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1c350 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1c360 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1c370 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1c380 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1c390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3a0 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1c3b0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1c3c0 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1c3d0 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1c3e0 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1c3f0 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1c400 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1c410 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1c420 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1c430 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1c440 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1c450 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1c460 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1c470 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1c480 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1c490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c4a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c4b0 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1c4c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c4d0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1c4e0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1c4f0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1c500 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1c510 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1c520 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1c530 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1c540 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1c550 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1c560 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1c570 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c580 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1c590 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1c5a0 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1c5b0 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1c5c0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1c5d0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1c5e0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1c5f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c600 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1c610 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1c620 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1c630 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1c640 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1c650 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1c660 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1c670 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1c680 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1c690 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1c6a0 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1c6b0 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1c6c0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1c6d0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1c6e0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1c6f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1c700 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1c710 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1c720 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1c730 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1c740 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1c750 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1c760 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1c770 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1c780 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1c790 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1c7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1c7b0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1c7c0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1c7d0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1c7e0 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1c7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c800 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1c810 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1c820 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1c830 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1c840 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1c850 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1c860 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1c870 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1c880 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1c890 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1c8a0 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1c8d0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1c8e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1c8f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1c900 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1c910 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1c920 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1c930 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c940 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1c950 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1c960 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1c970 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1c980 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1c990 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1c9a0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1c9b0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1c9c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1c9d0 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1c9e0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1c9f0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1ca00 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1ca10 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1ca20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ca30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1ca40 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1ca50 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1ca60 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1ca70 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1ca80 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1ca90 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
1caa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cab0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1cac0 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
1cad0 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  gOut);.    retur
1cae0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  n;.  }.  if( iCo
1caf0 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1cb00 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1cb10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cb20 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1cb30 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1cb40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cb50 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1cb60 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1cb70 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1cb80 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1cb90 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1cba0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1cbb0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1cbc0 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1cbd0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1cbe0 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1cbf0 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1cc00 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1cc10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc20 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1cc30 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1cc40 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1cc50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1cc60 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1cc70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1cc80 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1cc90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cca0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1ccb0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1ccc0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1ccd0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1cce0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1ccf0 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
1cd00 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66  er. .**.** An ef
1cd10 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1cd20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1cd30 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1cd40 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a  er iReg.  This.*
1cd50 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65  * is not garante
1cd60 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  eed for GetColum
1cd70 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74  n() - the result
1cd80 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
1cd90 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65  n.** any registe
1cda0 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75  r.  But the resu
1cdb0 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  lt is guaranteed
1cdc0 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69   to land in regi
1cdd0 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72  ster iReg.** for
1cde0 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28   GetColumnToReg(
1cdf0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  )..**.** There m
1ce00 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1ce10 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
1ce20 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
1ce30 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
1ce40 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
1ce50 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
1ce60 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
1ce70 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
1ce80 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
1ce90 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1cea0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1ceb0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1cec0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1ced0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1cee0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1cef0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1cf00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1cf10 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1cf20 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1cf30 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1cf40 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1cf50 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1cf60 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1cf70 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1cf80 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1cf90 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1cfa0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
1cfb0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1cfc0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
1cfd0 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
1cfe0 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
1cff0 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
1d000 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d010 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1d020 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1d030 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
1d040 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1d050 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1d060 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1d070 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1d080 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ( p->iTable==iTa
1d090 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
1d0a0 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
1d0b0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
1d0c0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1d0d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d0e0 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
1d0f0 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
1d100 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
1d110 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
1d120 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
1d130 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
1d140 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d150 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
1d160 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
1d170 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
1d180 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
1d190 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1d1a0 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
1d1b0 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
1d1c0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1d1d0 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
1d1e0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1d1f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
1d200 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1d210 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d220 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20  nToReg(.  Parse 
1d230 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1d240 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1d250 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1d260 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1d270 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1d280 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1d290 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1d2a0 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1d2b0 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1d2c0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1d2d0 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1d2e0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1d2f0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1d300 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1d310 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d320 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
1d330 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1d340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20   */.){.  int r1 
1d350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d360 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
1d370 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  e, pTab, iColumn
1d380 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20  , iTable, iReg, 
1d390 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52  0);.  if( r1!=iR
1d3a0 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  eg ) sqlite3Vdbe
1d3b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1d3c0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
1d3d0 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f  r1, iReg);.}.../
1d3e0 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
1d3f0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
1d400 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
1d410 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1d420 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1d430 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  ){.  int i;..#if
1d440 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d450 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1d460 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1d470 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
1d480 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
1d490 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23  CLEAR\n");.  }.#
1d4a0 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b  endif.  for(i=0;
1d4b0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1d4c0 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
1d4d0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1d4e0 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67  Cache[i].tempReg
1d4f0 0a 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d  .     && pParse-
1d500 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
1d510 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
1d520 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  pReg).    ){.   
1d530 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1d540 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1d550 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73  mpReg++] = pPars
1d560 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1d570 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iReg;.    }.  }.
1d580 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
1d590 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  che = 0;.}../*.*
1d5a0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
1d5b0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
1d5c0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
1d5d0 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
1d5e0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
1d5f0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
1d600 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
1d610 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1d620 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
1d630 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
1d640 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
1d650 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
1d660 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1d670 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
1d680 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
1d690 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
1d6a0 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
1d6b0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
1d6c0 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
1d6d0 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
1d6e0 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
1d6f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1d700 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
1d710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d720 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
1d730 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
1d740 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
1d750 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
1d760 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
1d770 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
1d780 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
1d790 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
1d7a0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
1d7b0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
1d7c0 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
1d7d0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1d7e0 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
1d7f0 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
1d800 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d810 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1d820 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
1d830 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1d840 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
1d850 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
1d860 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
1d870 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
1d880 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1d890 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1d8a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1d8b0 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
1d8c0 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
1d8d0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
1d8e0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
1d8f0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
1d900 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
1d910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d920 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1d930 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1d940 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
1d950 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
1d960 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1d970 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1d980 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1d990 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1d9a0 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1d9b0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
1d9c0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
1d9d0 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
1d9e0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
1d9f0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
1da00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1da10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1da20 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
1da30 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1da40 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  T */.../*.** Con
1da50 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78  vert a scalar ex
1da60 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
1da70 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72   a TK_REGISTER r
1da80 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65  eferencing.** re
1da90 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1daa0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
1dab0 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61  sure that iReg a
1dac0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a  lready contains.
1dad0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  ** the correct v
1dae0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70  alue for the exp
1daf0 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ression..*/.stat
1db00 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
1db10 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
1db20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
1db30 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1db40 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1db50 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1db60 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1db70 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1db80 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1db90 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1dba0 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1dbb0 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1dbc0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1dbd0 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1dbe0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1dbf0 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1dc00 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1dc10 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1dc20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1dc30 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1dc40 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1dc50 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1dc60 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1dc70 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1dc80 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1dc90 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1dca0 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1dcb0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1dcc0 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1dcd0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1dce0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1dcf0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1dd00 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1dd10 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1dd20 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1dd30 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1dd40 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1dd50 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1dd60 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1dd70 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1dd80 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1dd90 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1dda0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1ddb0 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1ddc0 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1ddd0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1dde0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ddf0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1de00 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1de10 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1de20 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1de30 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1de40 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ){.#if SQLITE_OM
1de50 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1de60 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23    iResult = 0;.#
1de70 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75  else.      iResu
1de80 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1de90 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1dea0 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , p, 0, 0);.#end
1deb0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1dec0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1ded0 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1dee0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1def0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1df00 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1df10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1df20 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1df30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1df40 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1df50 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1df60 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1df70 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1df80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1df90 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1dfa0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1dfb0 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1dfc0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1dfd0 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1dfe0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1dff0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1e000 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1e010 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1e020 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1e030 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1e040 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1e050 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1e060 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1e070 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1e080 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1e090 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1e0a0 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1e0b0 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1e0c0 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1e0d0 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1e0e0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1e0f0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1e100 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1e110 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1e120 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1e130 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1e140 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1e150 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1e160 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1e170 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1e180 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1e190 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1e1a0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1e1b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1e1c0 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1e1d0 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1e1e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1e1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e200 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1e210 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1e220 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1e230 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1e240 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1e250 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1e260 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1e270 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1e280 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1e290 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1e2a0 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1e2b0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1e2c0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1e2d0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1e2e0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1e2f0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1e300 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1e310 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1e320 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1e330 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1e340 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1e350 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1e360 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1e370 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1e380 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1e390 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1e3a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1e3b0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1e3c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1e3d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e3e0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1e3f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
1e400 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1e410 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1e420 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1e430 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1e440 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1e450 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1e460 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
1e470 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1e480 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1e490 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
1e4a0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1e4b0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
1e4c0 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
1e4d0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
1e4e0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1e4f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e500 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
1e510 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e520 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  n pCol->iMem;.  
1e530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
1e540 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
1e550 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
1e560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e570 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1e580 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
1e590 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1e5c0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
1e5d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1e5e0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e5f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
1e600 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
1e610 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
1e620 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
1e630 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e640 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1e650 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
1e660 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1e670 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20   if( iTab<0 ){. 
1e680 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
1e690 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b  e->iSelfTab<0 ){
1e6a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  .          /* Ge
1e6b0 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63  nerating CHECK c
1e6c0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e  onstraints or in
1e6d0 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72  serting into par
1e6e0 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tial index */.  
1e6f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1e700 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20  Expr->iColumn - 
1e710 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e720 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1e730 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
1e740 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ding an expressi
1e750 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20  on that is part 
1e760 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72  of an index wher
1e770 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
1e780 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74           ** in t
1e790 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74  he index refer t
1e7a0 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77  o the table to w
1e7b0 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62  hich the index b
1e7c0 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20  elongs */.      
1e7d0 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
1e7e0 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b  e->iSelfTab - 1;
1e7f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e800 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1e810 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1e820 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1e830 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e860 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1e870 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e8a0 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op2);.    }.   
1e8b0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1e8c0 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1e8d0 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1e8e0 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1e8f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e900 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1e910 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  case TK_TRUEFALS
1e920 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1e930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e940 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69  OP_Integer, sqli
1e950 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
1e960 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65 74  e(pExpr), target
1e970 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e980 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1e990 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e9a0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1e9b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
1e9c0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1e9d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e9e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e9f0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1ea00 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
1ea10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1ea20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ea30 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1ea40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ea50 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1ea60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1ea70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ea80 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1ea90 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
1eaa0 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1eab0 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
1eac0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1ead0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1eae0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1eaf0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
1eb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1eb10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1eb20 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
1eb30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1eb40 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1eb50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eb60 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1eb70 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1eb80 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1eb90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1eba0 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
1ebb0 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
1ebc0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ebd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1ebe0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1ebf0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ec00 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
1ec10 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
1ec20 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
1ec30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ec40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1ec50 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1ec60 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
1ec70 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
1ec80 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1ec90 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
1eca0 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
1ecb0 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
1ecc0 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
1ecd0 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
1ece0 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
1ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ed00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
1ed10 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
1ed20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
1ed30 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  AMIC);.      ret
1ed40 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ed50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ed60 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
1ed70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ed80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ed90 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1eda0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1edb0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1edc0 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
1edd0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ede0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
1edf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ee00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ee10 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
1ee20 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
1ee30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
1ee40 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
1ee50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1ee60 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1ee70 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e  lite3VListNumToN
1ee80 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  ame(pParse->pVLi
1ee90 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  st, pExpr->iColu
1eea0 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  mn);.        ass
1eeb0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1eec0 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20  oken[0]=='?' || 
1eed0 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  strcmp(pExpr->u.
1eee0 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b  zToken, z)==0 );
1eef0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1ef00 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20  >pVList[0] = 0; 
1ef10 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73  /* Indicate VLis
1ef20 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20  t may no longer 
1ef30 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1ef40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ef50 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63  beAppendP4(v, (c
1ef60 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49  har*)z, P4_STATI
1ef70 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
1ef80 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1ef90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1efa0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1efb0 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
1efc0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
1efd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1efe0 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
1eff0 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
1f000 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1f010 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
1f020 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
1f030 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
1f040 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1f050 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1f060 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f070 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
1f080 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1f090 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1f0a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f0b0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1f0c0 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
1f0d0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
1f0e0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1f0f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73  AddOp2(v, OP_Cas
1f110 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  t, target,.     
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
1f140 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
1f150 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  zToken, 0));.   
1f160 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
1f170 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1f180 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
1f190 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
1f1a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1f1b0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1f1c0 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
1f1d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52        return inR
1f1e0 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  eg;.    }.#endif
1f1f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f200 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1f210 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1f220 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
1f230 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1f240 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1f250 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51  E;.      p5 = SQ
1f260 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
1f270 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1f280 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
1f290 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1f2a0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1f2b0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1f2c0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1f2d0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1f2e0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78  K_EQ: {.      Ex
1f2f0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1f300 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1f310 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1f320 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29  sVector(pLeft) )
1f330 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65  {.        codeVe
1f340 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ctorCompare(pPar
1f350 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1f360 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20  t, op, p5);.    
1f370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f380 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f390 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f3a0 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  , pLeft, &regFre
1f3b0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1f3c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f3d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f3e0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f3f0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1f400 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f410 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  rse, pLeft, pExp
1f420 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1f430 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f440 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
1f450 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a  _STOREP2 | p5);.
1f460 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f470 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1f480 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1f490 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f4a0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1f4b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f4c0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
1f4d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
1f4e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f4f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
1f500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f510 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1f520 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1f530 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f540 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1f550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f560 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1f570 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1f580 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f590 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1f5a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f5b0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
1f5c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
1f5d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f5e0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
1f5f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1f600 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
1f610 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
1f620 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f630 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
1f640 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f650 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f660 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f670 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f6a0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
1f6b0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
1f6c0 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
1f6d0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
1f6e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
1f6f0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
1f700 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
1f710 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
1f720 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
1f730 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
1f740 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1f750 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
1f760 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
1f770 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
1f780 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f790 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20  AND==OP_And );  
1f7a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f7b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
1f7c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f7d0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20  TK_OR==OP_Or ); 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1f7f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
1f800 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f810 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
1f820 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74  d );           t
1f830 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f840 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  PLUS );.      as
1f850 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
1f860 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20  OP_Subtract );  
1f870 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f880 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
1f890 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
1f8a0 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
1f8b0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1f8c0 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a  ( op==TK_REM );.
1f8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f8e0 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
1f8f0 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  nd );      testc
1f900 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
1f910 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f920 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
1f930 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20  _BitOr );       
1f940 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f950 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
1f960 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
1f970 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20  H==OP_Divide ); 
1f980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f990 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
1f9a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f9b0 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
1f9c0 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63  tLeft );   testc
1f9d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
1f9e0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1f9f0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
1fa00 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20  P_ShiftRight ); 
1fa10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fa20 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
1fa30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
1fa40 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
1fa50 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1fa60 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
1fa70 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1fa80 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1fa90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1faa0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1fab0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1fac0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fad0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1fae0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1faf0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
1fb00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1fb10 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
1fb20 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
1fb30 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1fb40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1fb50 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1fb60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fb70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fb80 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
1fb90 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1fba0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1fbb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
1fbc0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
1fbd0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
1fbe0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
1fbf0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1fc00 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
1fc10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1fc20 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69  eturn target;.#i
1fc30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fc40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1fc50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fc60 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
1fc70 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
1fc80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fc90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fca0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1fcb0 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1fcc0 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  (v, pLeft->u.zTo
1fcd0 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ken, 1, target);
1fce0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fcf0 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20  target;.#endif. 
1fd00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fd10 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54      tempX.op = T
1fd20 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
1fd30 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d     tempX.flags =
1fd40 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
1fd50 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20  TokenOnly;.     
1fd60 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75     tempX.u.iValu
1fd70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
1fd80 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fd90 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fda0 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
1fdb0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1fdc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fdd0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fde0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fdf0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
1fe00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1fe10 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
1fe20 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1fe30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1fe40 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1fe50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fe60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fe70 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
1fe80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1fe90 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1fea0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
1feb0 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
1fec0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1fed0 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
1fee0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
1fef0 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
1ff00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ff10 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
1ff20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ff30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ff40 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1ff50 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1ff60 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ff70 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  1==0 );.      sq
1ff80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ff90 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67  v, op, r1, inReg
1ffa0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ffb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ffc0 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
1ffd0 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
1ffe0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1fff0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
20000 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20     int bNormal; 
20010 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
20020 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  IS FALSE */.    
20030 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
20040 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
20050 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20060 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
20070 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20080 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
20090 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
200a0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
200b0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
200c0 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d  .      bNormal =
200d0 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
200e0 49 53 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  IS;.      testca
200f0 73 65 28 20 69 73 54 72 75 65 20 26 26 20 62 4e  se( isTrue && bN
20100 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65  ormal);.      te
20110 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20  stcase( !isTrue 
20120 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
20130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20140 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73  dOp4Int(v, OP_Is
20150 54 72 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c  True, r1, inReg,
20160 20 21 69 73 54 72 75 65 2c 20 69 73 54 72 75 65   !isTrue, isTrue
20170 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20   ^ bNormal);.   
20180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20190 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
201a0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
201b0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
201c0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
201d0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
201e0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
201f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20200 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
20210 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
20220 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
20230 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
20240 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
20250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20260 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20270 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
20280 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
20290 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
202a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
202b0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
202c0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
202d0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
202e0 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
202f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20300 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
20310 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20320 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
20330 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
20340 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
20350 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
20360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20380 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
20390 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
203a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
203b0 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
203c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
203d0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
203e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
203f0 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
20400 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
20410 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
20420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
20430 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20440 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20450 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
20460 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20470 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
20480 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
20490 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
204a0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
204b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
204c0 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61   return pInfo->a
204d0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
204e0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
204f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20500 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
20510 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
20520 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
20530 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
20540 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20550 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
20560 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
20570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20580 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20590 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
205a0 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
205b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
205c0 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
205d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
205e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
205f0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
20600 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
20610 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
20620 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
20630 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
20640 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
20650 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
20660 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20680 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20690 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
206a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
206b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
206c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
206d0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
206e0 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
206f0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
20700 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
20710 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
20720 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
20730 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
20740 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
20750 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e  /..      if( Con
20760 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
20770 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  e) && sqlite3Exp
20780 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
20790 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
207a0 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
207b0 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70  tions can be exp
207c0 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74  ensive. So try t
207d0 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20  o move constant 
207e0 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
207f0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
20800 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e  inner loop, even
20810 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61   if that means a
20820 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e  n extra OP_Copy.
20830 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
20840 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
20850 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
20860 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20   pExpr, -1);.   
20870 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
20880 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20890 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
208a0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
208b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
208c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
208d0 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
208e0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
208f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20900 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
20910 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
20920 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
20930 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
20940 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
20950 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
20960 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20970 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
20980 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
20990 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
209a0 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
209b0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
209c0 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
209d0 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
209e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
209f0 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
20a00 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
20a10 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
20a20 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
20a30 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
20a40 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
20a50 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
20a60 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
20a70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20a80 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20a90 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
20aa0 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
20ab0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20ac0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
20ad0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
20ae0 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
20af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20b00 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
20b10 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
20b20 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
20b30 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
20b40 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
20b50 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
20b60 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
20b70 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
20b80 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
20b90 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
20ba0 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
20bb0 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
20bc0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20bd0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20be0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20bf0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
20c00 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
20c10 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
20c20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20c30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20c40 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
20c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20c60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
20c70 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20c80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20c90 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
20ca0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20cc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
20cd0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
20ce0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
20cf0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20d00 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20d10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20d20 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
20d30 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
20d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20d50 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
20d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20d70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20d80 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
20d90 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20da0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20db0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
20dc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
20dd0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
20de0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20df0 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
20e00 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
20e10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
20e20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
20e30 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
20e40 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
20e50 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
20e60 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
20e70 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
20e80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20e90 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20ea0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20eb0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
20ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
20ed0 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
20ee0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20ef0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
20f00 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20f10 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
20f20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  );.      }..#ifd
20f30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
20f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46        /* The AFF
20f50 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e  INITY() function
20f60 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20   evaluates to a 
20f70 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
20f80 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  ribes.      ** t
20f90 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
20fa0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
20fb0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
20fc0 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20  for testing of. 
20fd0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69       ** the SQLi
20fe0 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20  te type logic.. 
20ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21000 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21010 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21020 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20  AFFINITY ){.    
21030 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21040 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f  azAff[] = { "blo
21050 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d  b", "text", "num
21060 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22  eric", "integer"
21070 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20  , "real" };.    
21080 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20      char aff;.  
21090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
210a0 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
210b0 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
210c0 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72  xprAffinity(pFar
210d0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
210e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
210f0 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
21100 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20   target, .      
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a          aff ? az
21130 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41  Aff[aff-SQLITE_A
21140 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65  FF_BLOB] : "none
21150 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
21160 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20  rn target;.     
21170 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
21180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
21190 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
211a0 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
211b0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
211c0 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
211d0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
211e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
211f0 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
21200 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
21210 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
21220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21230 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
21240 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21250 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
21260 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
21270 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
21280 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
21290 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
212a0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
212b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
212c0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
212d0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
212e0 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
212f0 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
21300 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
21310 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
21320 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
21330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21340 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
21350 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
21360 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
21370 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
21380 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
21390 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
213a0 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
213b0 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
213c0 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
213d0 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
213e0 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
213f0 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
21400 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
21410 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
21420 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
21430 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
21440 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
21450 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
21460 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
21470 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
21480 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
21490 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
214a0 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
214b0 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
214c0 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
214d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
214e0 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
214f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21500 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
21510 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
21520 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
21530 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
21540 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
21550 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
21560 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
21570 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
21580 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21590 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
215a0 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
215b0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
215c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
215d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
215e0 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
215f0 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
21600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
21610 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21620 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21640 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21650 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
21660 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
21670 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
21680 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
21690 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
216a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
216b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
216c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
216d0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
216e0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
216f0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
21700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21710 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
21720 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
21730 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
21760 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
21770 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
21780 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21790 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
217a0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
217b0 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
217c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
217d0 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
217e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
217f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
21800 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
21810 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
21820 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
21830 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21840 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
21850 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
21860 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
21870 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
21880 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
21890 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
218a0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
218b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
218c0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
218d0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
218e0 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
218f0 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
21900 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
21910 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
21920 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
21930 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
21940 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
21950 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
21960 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
21970 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
21980 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
21990 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
219a0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
219b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
219c0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
219d0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
219e0 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
219f0 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
21a00 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
21a10 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
21a20 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
21a30 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
21a40 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
21a50 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
21a60 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
21a70 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
21a80 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
21a90 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
21aa0 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
21ab0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
21ac0 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
21ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
21ae0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
21af0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
21b00 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
21b10 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
21b20 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
21b30 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
21b40 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21b50 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21b60 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21b70 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21b80 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21b90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21ba0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21bb0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21bc0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
21bd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
21be0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
21bf0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
21c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21c10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
21c20 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
21c30 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
21c40 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21c50 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
21c60 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
21c70 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
21c80 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21c90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21ca0 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21cb0 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21cc0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21cd0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
21ce0 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
21cf0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
21d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d10 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
21d20 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
21d30 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
21d40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
21d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21d70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21d80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21d90 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
21da0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
21db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21dc0 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
21dd0 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
21de0 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
21df0 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
21e20 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
21e30 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
21e40 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
21e50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21e60 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
21e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e80 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
21e90 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
21ea0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21eb0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21ec0 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
21ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21ee0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21ef0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21f00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21f10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
21f20 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
21f30 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
21f40 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
21f50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21f60 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
21f70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21f80 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21f90 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
21fa0 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
21fb0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21fc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
21fd0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
21fe0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
21ff0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
22000 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
22010 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
22020 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
22030 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
22040 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
22050 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
22060 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22070 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
22080 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
22090 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  n;.      if( pEx
220a0 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
220b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
220c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
220d0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  able = sqlite3Co
220e0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
220f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
22100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
22110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22120 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
22130 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
22140 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
22150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
22160 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
22170 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
22180 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45  e!=(n = sqlite3E
22190 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
221a0 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20  xpr->pLeft)) .  
221b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
221c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
221d0 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
221e0 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
221f0 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
22220 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20  Table, n);.     
22230 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22240 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
22250 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43  able + pExpr->iC
22260 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  olumn;.    }.   
22270 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
22280 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
22290 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
222a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
222b0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
222c0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
222d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
222e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
222f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22300 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
22310 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22320 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
22330 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
22340 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
22350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22360 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22370 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
22380 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
22390 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
223a0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
223b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
223c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
223d0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
223e0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
223f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22400 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
22410 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22420 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
22430 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22440 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
22450 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22460 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
22470 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
22480 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
22490 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
224a0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
224b0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
224c0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
224d0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
224e0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
224f0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
22500 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
22510 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
22520 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
22530 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
22540 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
22550 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
22560 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
22570 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
22580 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
22590 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
225a0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
225b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
225c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
225d0 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
225e0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
225f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
22600 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
22610 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
22620 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
22630 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
22640 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
22650 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
22660 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
22670 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
22680 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
22690 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
226a0 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
226b0 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
226c0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
226d0 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
226e0 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
226f0 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
22700 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
22710 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
22720 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
22730 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22740 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
22750 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22760 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
22770 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22780 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
22790 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
227a0 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
227b0 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
227c0 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
227d0 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
227e0 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
227f0 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
22800 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
22810 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
22820 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
22830 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
22840 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
22850 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
22860 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
22870 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
22880 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
22890 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
228a0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
228b0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
228c0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
228d0 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
228e0 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
228f0 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
22900 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
22910 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
22920 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
22930 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
22940 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
22950 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
22960 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
22970 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
22980 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
22990 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
229a0 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
229b0 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
229c0 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
229d0 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
229e0 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
229f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
22a00 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
22a10 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
22a20 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
22a30 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
22a40 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
22a50 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
22a60 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
22a70 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
22a80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
22a90 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
22aa0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
22ab0 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
22ac0 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
22ad0 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
22ae0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
22af0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
22b00 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
22b10 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
22b20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
22b30 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
22b40 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
22b50 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
22b60 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
22b70 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
22b80 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
22b90 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
22ba0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
22bb0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
22bc0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
22bd0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22be0 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
22bf0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
22c00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22c10 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22c20 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
22c30 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
22c40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22c50 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
22c60 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
22c70 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
22c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22c90 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
22ca0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
22cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
22cd0 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
22ce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22cf0 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
22d00 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
22d10 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
22d20 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
22d30 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
22d40 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
22d50 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
22d60 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22d70 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
22d80 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
22d90 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22db0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22dc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22dd0 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22de0 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22df0 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22e00 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
22e10 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
22e20 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
22e30 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
22e40 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
22e50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22e60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
22e70 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22e80 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22e90 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22ea0 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22eb0 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22ec0 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22ed0 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22ee0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22ef0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22f00 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
22f10 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
22f20 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
22f30 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
22f40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
22f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22f60 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
22f70 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22f80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22fa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22fb0 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22fc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22fd0 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22fe0 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
23000 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
23010 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
23020 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
23030 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
23040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
23050 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
23060 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
23070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23080 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
23090 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  e);.      inReg 
230a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
230b0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
230c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
230d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
230e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
230f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23100 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
23110 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b  ere(v, addrINR);
23120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23130 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
23140 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20  drINR, inReg);. 
23150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23160 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
23170 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
23180 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
23190 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
231a0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
231b0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
231c0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
231d0 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
231e0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
231f0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
23200 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
23210 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
23220 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
23230 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
23240 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
23250 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
23260 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
23270 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
23280 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
23290 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
232a0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
232b0 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
232c0 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
232d0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
232e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
232f0 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
23300 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
23310 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
23320 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
23330 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
23340 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
23350 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
23360 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
23370 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
23380 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
23390 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
233a0 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
233b0 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
233c0 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
233d0 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
233e0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
233f0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
23400 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
23410 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
23420 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
23430 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
23440 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
23450 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
23460 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
23470 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
23480 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
23490 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
234a0 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
234b0 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
234c0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
234d0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
234e0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
234f0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
23500 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
23510 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
23520 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23540 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
23550 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
23560 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
23570 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
23580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
23590 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
235a0 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
235b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
235c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
235d0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
235e0 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
235f0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
23600 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23620 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
23630 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
23640 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
23650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
23660 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
23670 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
23680 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
23690 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
236a0 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
236b0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
236c0 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
236e0 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
236f0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
23700 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
23730 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
23740 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23760 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
23770 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
23780 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
23790 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
237a0 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
237b0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
237c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
237d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
237e0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
237f0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
23800 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
23810 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
23820 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
23830 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
23840 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23850 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
23860 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
23870 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
23880 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
23890 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
238a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
238b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
238c0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
238d0 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
238e0 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
238f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23900 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
23910 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
23920 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
23930 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
23940 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
23950 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
23960 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23970 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23980 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23990 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
239a0 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
239b0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
239c0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
239d0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
239e0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
239f0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
23a00 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
23a10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
23a20 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
23a30 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23a40 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23a50 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23a60 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23a70 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23a80 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23a90 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23aa0 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23ab0 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
23ac0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23ad0 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
23ae0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
23af0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
23b00 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
23b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
23b20 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
23b30 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
23b40 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
23b50 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
23b60 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
23b70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23b80 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
23b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
23ba0 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
23bb0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
23bc0 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
23bd0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
23be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23bf0 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
23c00 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
23c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
23c30 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23c40 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
23c50 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
23c60 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23c80 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23c90 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
23ca0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
23cb0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
23cc0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
23cd0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
23ce0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23cf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23d00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
23d10 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23d20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23d40 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
23d50 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
23d60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
23d70 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
23d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
23d90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
23da0 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
23db0 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
23dc0 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
23dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23de0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23df0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23e00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
23e10 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
23e20 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
23e30 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
23e40 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
23e50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
23e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23e80 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
23e90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
23ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23eb0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
23ec0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
23ed0 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
23ee0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
23ef0 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
23f00 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
23f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23f20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
23f30 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
23f40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
23f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
23f60 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
23f70 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
23f80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
23f90 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
23fa0 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
23fb0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
23fc0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
23fd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
23fe0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23ff0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
24000 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
24010 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
24020 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
24030 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
24040 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
24050 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24060 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
24090 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
240a0 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
240b0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
240c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
240d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
240e0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
240f0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
24100 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
24110 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24120 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
24130 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24140 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
24150 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
24160 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
24170 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
24180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24190 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
241a0 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
241b0 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
241c0 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
241d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
241e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
241f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
24200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24210 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
24220 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
24230 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
24240 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
24270 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
24280 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
24290 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
242a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
242b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
242c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
242d0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
242e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
242f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24300 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
24310 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
24320 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
24330 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
24340 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
24350 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
24360 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n time..**.** If
24370 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e   regDest>=0 then
24380 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
24390 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20  lways stored in 
243a0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e  that register an
243b0 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  d the.** result 
243c0 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e  is not reusable.
243d0 20 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74    If regDest<0 t
243e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
243f0 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20   is free to .** 
24400 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
24410 77 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e  whereever it wan
24420 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ts.  The registe
24430 72 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72  r where the expr
24440 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74  ession .** is st
24450 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64  ored is returned
24460 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c  .  When regDest<
24470 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c  0, two identical
24480 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c   expressions wil
24490 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65  l.** code to the
244a0 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a   same register..
244b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
244c0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
244d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
244e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
244f0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24500 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
24510 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
24520 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
24530 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
24540 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
24550 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
24560 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
24570 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
24580 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
24590 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
245a0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
245b0 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
245c0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69  >pConstExpr;.  i
245d0 66 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20  f( regDest<0 && 
245e0 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
245f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24600 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Item;.    int i;
24610 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
24620 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
24630 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
24640 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
24650 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
24660 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
24670 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45  pare(0,pItem->pE
24680 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
24690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
246a0 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
246b0 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
246c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
246d0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
246e0 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
246f0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
24700 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
24710 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
24720 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
24730 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
24740 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
24750 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
24760 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
24770 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
24780 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20  e = regDest<0;. 
24790 20 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c      if( regDest<
247a0 30 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b  0 ) regDest = ++
247b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
247c0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
247d0 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
247e0 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  est;.  }.  pPars
247f0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
24800 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44  p;.  return regD
24810 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  est;.}../*.** Ge
24820 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
24830 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
24840 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
24850 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
24860 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
24870 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
24880 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
24890 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
248a0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
248b0 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
248c0 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
248d0 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
248e0 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
248f0 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
24900 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
24910 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
24920 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
24930 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
24940 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
24950 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
24960 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
24970 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
24980 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24990 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
249a0 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
249b0 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
249c0 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
249d0 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
249e0 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
249f0 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
24a00 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
24a10 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
24a20 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
24a30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24a40 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
24a50 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24a60 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
24a70 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
24a80 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
24a90 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
24aa0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
24ab0 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
24ac0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24ad0 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
24ae0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24af0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24b00 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  ).  ){.    *pReg
24b10 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20    = 0;.    r2 = 
24b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24b30 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24b40 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  xpr, -1);.  }els
24b50 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
24b60 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
24b70 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
24b80 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24b90 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24ba0 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
24bb0 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
24bc0 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
24bd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24be0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24bf0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24c00 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
24c10 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
24c20 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
24c30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24c40 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
24c50 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
24c60 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
24c70 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
24c80 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
24c90 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
24ca0 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
24cb0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
24cc0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24cd0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24ce0 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
24cf0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24d00 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24d10 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
24d20 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
24d30 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
24d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
24d50 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
24d60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
24d70 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
24d80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24d90 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24da0 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
24db0 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
24dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
24dd0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
24de0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24df0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
24e10 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
24e20 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
24e30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
24e40 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
24e50 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
24e60 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
24e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24e80 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
24e90 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
24ea0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
24eb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
24ec0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
24ed0 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
24ee0 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
24ef0 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
24f00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24f10 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
24f20 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
24f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24f40 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
24f50 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
24f60 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
24f70 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
24f80 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
24f90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
24fa0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
24fb0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24fc0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
24fd0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24fe0 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
24ff0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25000 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
25010 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
25020 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
25030 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25040 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
25050 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
25060 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
25070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25080 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
25090 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
250a0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
250b0 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
250c0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
250d0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
250e0 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
250f0 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
25100 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
25110 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
25120 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
25130 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
25140 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
25150 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
25160 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
25170 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
25180 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
25190 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
251a0 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
251b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
251c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
251d0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
251e0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
251f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25200 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
25210 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
25220 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
25230 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
25240 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
25260 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25270 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
25280 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25290 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
252a0 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
252b0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
252c0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
252d0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
252e0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
252f0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
25300 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
25310 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
25320 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
25330 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
25340 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
25350 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
25360 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
25370 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
25380 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
25390 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
253a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
253b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
253c0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
253d0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
253e0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
253f0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
25400 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
25410 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
25420 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
25430 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
25440 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25450 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
25460 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25470 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
25480 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
25490 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
254a0 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
254b0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
254c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
254d0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
254e0 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
254f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
25500 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
25510 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
25520 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
25530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25540 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
25550 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
25560 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
25570 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
25580 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
25590 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
255a0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
255b0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
255c0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
255d0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
255e0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
255f0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
25600 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
25610 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
25620 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
25630 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ated.  The numbe
25640 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a  r returned will.
25650 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c  ** usually be pL
25660 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d  ist->nExpr but m
25670 69 67 68 74 20 62 65 20 72 65 64 75 63 65 64 20  ight be reduced 
25680 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  if SQLITE_ECEL_O
25690 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66  MITREF.** is def
256a0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ined..**.** The 
256b0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
256c0 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
256d0 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
256e0 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
256f0 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
25700 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
25710 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
25720 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25730 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
25740 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
25750 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
25760 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
25770 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
25780 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
25790 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
257a0 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
257b0 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
257c0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
257d0 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
257e0 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
257f0 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
25800 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
25810 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
25820 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
25830 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
25840 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
25850 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
25860 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49  here..** If SQLI
25870 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20  TE_ECEL_OMITREF 
25880 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65  is also set, the
25890 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77 69 74  n the values wit
258a0 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  h u.x.iOrderByCo
258b0 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c  l>0.** are simpl
258c0 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72  y omitted rather
258d0 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69   than being copi
258e0 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a  ed from srcReg..
258f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
25900 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
25910 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25920 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25930 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
25940 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
25950 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
25960 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
25970 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
25980 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
25990 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
259a0 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72  ults */.  int sr
259b0 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  cReg,        /* 
259c0 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73  Source registers
259d0 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
259e0 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  REF */.  u8 flag
259f0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
25a00 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
25a10 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
25a20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25a30 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
25a40 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   j, n;.  u8 copy
25a50 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
25a60 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
25a70 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
25a80 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  opy;.  Vdbe *v =
25a90 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25aa0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
25ab0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25ac0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
25ad0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
25ae0 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
25af0 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
25b00 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
25b10 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
25b20 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
25b30 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
25b40 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
25b50 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
25b60 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
25b70 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
25b80 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
25b90 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
25ba0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
25bb0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
25bc0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
25bd0 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65  !=0 && (j = pIte
25be0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
25bf0 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ol)>0 ){.      i
25c00 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
25c10 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29  E_ECEL_OMITREF )
25c20 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20  {.        i--;. 
25c30 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
25c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25c50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25c60 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b  p2(v, copyOp, j+
25c70 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74  srcReg-1, target
25c80 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
25c90 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
25ca0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25cb0 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71  FACTOR)!=0 && sq
25cc0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25cd0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
25ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25cf0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
25d00 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
25d10 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
25d20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
25d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25d40 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
25d50 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
25d60 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
25d70 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
25d80 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
25d90 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
25da0 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
25db0 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
25dc0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
25dd0 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
25de0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25df0 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
25e00 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
25e10 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
25e20 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
25e30 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
25e40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
25e50 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
25e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25e80 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
25e90 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
25ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25ec0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
25ed0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
25ee0 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
25ef0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
25f00 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
25f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
25f20 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
25f30 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
25f40 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
25f50 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
25f60 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
25f70 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
25f80 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
25f90 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
25fa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
25fb0 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
25fc0 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
25fd0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
26000 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
26010 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
26020 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
26030 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
26040 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
26050 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26060 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
26070 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
26080 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
26090 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
260a0 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
260b0 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
260c0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
260d0 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
260e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
260f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
26100 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
26110 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
26120 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
26130 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
26140 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
26150 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
26160 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
26170 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
26180 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
26190 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
261a0 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
261b0 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
261c0 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
261d0 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
261e0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
261f0 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
26200 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
26210 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
26220 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
26230 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
26240 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
26250 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
26260 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
26270 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
26280 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
26290 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
262a0 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
262b0 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
262c0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
262d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
262e0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
262f0 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d  egister */...  m
26300 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
26310 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26320 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
26330 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
26340 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
26350 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
26360 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
26370 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
26380 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
26390 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
263a0 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
263b0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
263c0 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
263d0 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
263e0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
263f0 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
26400 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
26410 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
26420 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
26430 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
26440 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
26450 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
26460 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
26470 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
26480 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
26490 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
264a0 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
264b0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
264c0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
264d0 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
264e0 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
264f0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
26500 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
26510 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
26520 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
26530 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
26540 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
26550 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
26560 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
26570 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
26580 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  being from the O
26590 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
265a0 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20  e of a join.    
265b0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ** so that the s
265c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
265d0 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77  rget() routine w
265e0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
265f0 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69  to move.    ** i
26600 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
26610 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
26620 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
26630 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
26640 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  his,.    ** for 
26650 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20  clarity, but we 
26660 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20  are out of bits 
26670 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67  in the Expr.flag
26680 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20  s field so we.  
26690 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75    ** have to reu
266a0 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  se the EP_FromJo
266b0 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e  in bit.  Bummer.
266c0 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c   */.    exprX.fl
266d0 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
266e0 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
266f0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
26700 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
26710 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
26720 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26730 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26740 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
26750 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
26760 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
26770 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26780 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26790 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
267a0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
267b0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
267c0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
267d0 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
267e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
267f0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26800 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26810 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26820 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26830 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26840 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26850 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26860 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26870 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
26880 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26890 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
268a0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
268b0 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
268c0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
268d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
268e0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
268f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26900 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26910 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26920 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26930 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26940 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26950 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26960 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26970 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26980 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26990 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
269a0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
269b0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
269c0 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
269d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
269e0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
269f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
26a00 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
26a10 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
26a20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
26a30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26a40 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
26a50 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
26a60 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
26a70 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
26a80 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
26a90 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
26aa0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
26ab0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
26ac0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
26ad0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
26ae0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
26af0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
26b00 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26b10 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
26b20 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
26b30 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
26b40 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
26b50 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
26b60 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
26b70 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
26b80 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
26b90 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
26ba0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
26bb0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
26bc0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
26bd0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
26be0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
26bf0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
26c00 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
26c10 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
26c20 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
26c30 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
26c40 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
26c50 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
26c60 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
26c70 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
26c80 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
26c90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
26ca0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
26cb0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
26cc0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
26cd0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
26ce0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
26cf0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
26d00 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26d10 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
26d20 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
26d30 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
26d40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
26d50 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26d60 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
26d70 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
26d80 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
26d90 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
26da0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
26db0 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
26dc0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
26dd0 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
26de0 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
26df0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
26e00 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
26e10 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
26e20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
26e30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26e40 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
26e50 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26e60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26e70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26e80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26e90 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
26ea0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
26eb0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
26ec0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
26ed0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
26ee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26ef0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26f00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26f10 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26f30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26f40 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
26f50 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
26f60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
26f70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26f80 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26fa0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26fc0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26fd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26fe0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27000 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
27010 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
27020 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27030 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27040 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27050 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27060 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
27070 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
27080 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27090 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
270a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
270b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
270c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
270d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
270e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
270f0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27100 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27110 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27120 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20  _TRUTH: {.      
27130 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20  int isNot;      
27140 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f  /* IS NOT TRUE o
27150 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  r IS NOT FALSE *
27160 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
27170 75 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52  ue;     /* IS TR
27180 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
27190 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  E */.      testc
271a0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
271b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f  =0 );.      isNo
271c0 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  t = pExpr->op2==
271d0 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20  TK_ISNOT;.      
271e0 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
271f0 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
27200 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
27210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
27220 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
27230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27240 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e  ( !isTrue && isN
27250 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ot );.      if( 
27260 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29  isTrue ^ isNot )
27270 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27280 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27290 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
272a0 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45    isNot ? SQLITE
272d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29  _JUMPIFNULL : 0)
272e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
272f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27300 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
27310 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27320 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f   isNot ? SQLITE_
27350 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b  JUMPIFNULL : 0);
27360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
27370 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27380 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
27390 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
273a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
273b0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
273c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
273d0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
273e0 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
273f0 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
27400 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
27410 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
27420 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
27430 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
27440 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
27450 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
27460 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
27470 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
27480 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
27490 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
274a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
274b0 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
274c0 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
274d0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
274e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
274f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27500 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27510 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27520 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27530 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
27540 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
27550 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27560 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27570 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
27580 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
27590 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
275a0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
275b0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
275e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
275f0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
27600 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
27610 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
27620 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27630 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
27640 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
27650 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
27660 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
27670 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27680 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
27690 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
276a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
276b0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
276c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
276d0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
276e0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
276f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27700 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
27710 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
27720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27730 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
27740 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
27750 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
27760 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27770 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
27780 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27790 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
277a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
277b0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
277c0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
277d0 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
277e0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
277f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27800 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
27810 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27820 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27830 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
27840 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
27850 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27860 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
27870 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27880 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
27890 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
278a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
278b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
278c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
278d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
278e0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
278f0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
27900 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
27910 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
27920 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
27930 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
27940 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
27950 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
27960 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
27970 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27980 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
27990 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
279a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
279b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
279c0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
279d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
279e0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
279f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
27a00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27a10 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
27a20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27a30 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
27a40 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
27a50 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27a60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
27a70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27a80 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
27a90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27aa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27ab0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
27ac0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
27ad0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
27ae0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20  ite3ExprIfTrue, 
27af0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27b20 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
27b30 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
27b40 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
27b50 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
27b60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
27b70 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
27b80 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
27b90 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
27ba0 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
27bb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
27bc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
27bd0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
27be0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27bf0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
27c00 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
27c10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
27c20 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
27c30 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
27c40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27c50 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27c60 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
27c70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  r:.      if( exp
27c80 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
27c90 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
27ca0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27cb0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
27cc0 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
27cd0 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
27ce0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d  {.        /* No-
27cf0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
27d00 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
27d10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27d20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27d30 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
27d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27d50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
27d60 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
27d70 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
27d80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27d90 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
27da0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
27dc0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27dd0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27de0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27df0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
27e00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27e10 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
27e20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
27e30 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27e40 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
27e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
27e60 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
27e70 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
27e80 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
27e90 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
27ea0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
27eb0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
27ec0 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
27ed0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
27ee0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
27ef0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
27f00 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
27f10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
27f20 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
27f30 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
27f40 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
27f50 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
27f60 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
27f70 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
27f80 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
27f90 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
27fa0 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
27fb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
27fc0 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
27fd0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
27fe0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
27ff0 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
28000 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28010 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
28020 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
28030 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
28040 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
28050 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
28060 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
28070 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
28080 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
28090 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
280a0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
280b0 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  rn; /* Existence
280c0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
280d0 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
280e0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
280f0 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
28100 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
28110 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
28120 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
28130 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
28140 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
28150 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
28160 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
28170 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
28180 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
28190 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
281a0 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
281b0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
281c0 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
281d0 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
281e0 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
281f0 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
28200 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
28210 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
28220 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28240 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
28250 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
28260 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
28270 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
28280 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
28290 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
282a0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
282b0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
282c0 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
282d0 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
282e0 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
282f0 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
28300 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
28310 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
28320 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
28330 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
28340 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
28350 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
28360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
28370 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
28380 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
28390 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
283a0 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
283b0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
283c0 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
283d0 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
283e0 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
283f0 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
28400 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
28410 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
28420 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
28430 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
28440 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
28450 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
28460 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28470 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
28480 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
28490 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
284a0 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
284b0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
284c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
284d0 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
284e0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
284f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
28500 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
28510 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
28520 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
28530 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
28540 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28550 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
28560 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
28570 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
28580 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
28590 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
285a0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
285b0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
285c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
285d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
285e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
285f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
28600 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28610 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28630 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
28640 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28650 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28660 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28670 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28680 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
28690 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
286a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
286b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
286c0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
286d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
286e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
286f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
28700 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
28710 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
28720 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
28730 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28740 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
28750 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
28760 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
28770 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
28780 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
28790 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
287a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
287b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
287c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
287d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
287e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
287f0 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
28800 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
28810 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
28820 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28830 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28850 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28860 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28870 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28880 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28890 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
288a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
288b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
288c0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
288d0 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
288e0 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
288f0 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
28900 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
28910 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
28920 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28930 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28940 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28950 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
28960 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
28970 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
28980 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
28990 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
289a0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
289b0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
289c0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
289d0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
289e0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
289f0 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
28a00 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
28a10 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
28a20 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28a40 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28a50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28a60 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
28a90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28aa0 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
28ab0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
28ac0 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
28ad0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
28ae0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28af0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28b00 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
28b30 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
28b40 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
28b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28b60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28b70 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
28b80 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
28b90 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
28ba0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
28bb0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28bc0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
28bd0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
28be0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
28bf0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
28c00 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
28c10 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
28c20 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
28c30 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
28c40 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
28c50 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
28c60 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
28c70 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
28c80 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
28c90 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
28ca0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
28cb0 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
28cc0 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
28cd0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
28ce0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28cf0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28d00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28d10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28d20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28d30 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28d40 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
28d50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
28d60 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28d70 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
28d80 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
28d90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28da0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
28db0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
28dd0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28de0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28df0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28e00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28e10 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
28e20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28e30 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
28e40 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
28e50 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28e60 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
28e70 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
28e80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28e90 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
28ea0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28eb0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
28ec0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
28ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28ee0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
28ef0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
28f00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28f10 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
28f20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
28f30 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
28f40 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
28f50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28f60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28f70 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
28f80 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28f90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28fa0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28fb0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
28fc0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
28fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28fe0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
28ff0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
29000 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29010 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29020 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
29030 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
29040 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
29050 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29060 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
29070 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
29080 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
29090 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
290a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
290b0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
290c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
290d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
290e0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
290f0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
29100 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
29110 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29120 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29130 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
29140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
29160 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
29170 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29180 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
29190 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
291a0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
291b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
291c0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
291d0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
291e0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
291f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
29200 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29210 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29220 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
29230 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
29240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29250 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29260 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
29270 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
29280 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
29290 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
292a0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
292b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
292c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
292d0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
292e0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
292f0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
29300 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
29310 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
29320 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29330 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
29340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29350 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
29360 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29370 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
29380 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
29390 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
293a0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
293b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
293c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
293d0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
293e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
293f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29400 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
29410 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
29420 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
29430 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
29440 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
29450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29460 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
29470 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
29480 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
29490 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
294a0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
294b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
294c0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
294d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
294e0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
294f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
29500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29510 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
29520 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
29530 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
29540 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
29550 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
29560 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
29570 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
29580 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
29590 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
295a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
295b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
295c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
295d0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
295e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
295f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
29600 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
29610 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
29620 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
29630 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
29640 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
29650 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
29660 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
29670 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
29680 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
29690 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
296a0 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
296b0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
296c0 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
296d0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
296e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
296f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29700 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
29710 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
29720 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
29730 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
29740 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
29750 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
29760 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
29770 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
29780 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
29790 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
297a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
297b0 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
297c0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
297d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
297e0 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
297f0 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
29800 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
29810 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
29820 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
29830 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
29840 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
29850 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
29860 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
29870 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
29880 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
29890 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
298a0 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
298b0 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
298c0 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
298d0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
298e0 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
298f0 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
29900 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
29910 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
29920 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
29930 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
29940 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
29950 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
29960 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
29970 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
29980 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
29990 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
299a0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
299b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
299c0 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
299d0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
299e0 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
299f0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
29a00 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
29a10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29a20 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
29a30 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
29a40 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29a50 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
29a60 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
29a70 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
29a80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
29a90 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
29aa0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
29ab0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
29ac0 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
29ad0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
29ae0 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
29af0 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
29b00 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
29b10 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
29b20 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
29b30 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
29b40 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
29b50 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
29b60 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
29b70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
29b80 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
29b90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
29ba0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29bb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
29bc0 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
29bd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29be0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
29bf0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
29c00 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
29c10 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
29c20 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
29c30 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
29c40 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
29c50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29c60 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
29c70 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29c80 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
29c90 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
29ca0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
29cb0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
29cc0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
29cd0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
29ce0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
29cf0 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
29d00 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
29d10 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29d20 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
29d30 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
29d40 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
29d50 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
29d60 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
29d70 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
29d80 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
29d90 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
29da0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
29db0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
29dc0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
29dd0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
29de0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
29df0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
29e00 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
29e10 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
29e20 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
29e30 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
29e40 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
29e50 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
29e60 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
29e70 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
29e80 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
29e90 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
29ea0 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
29eb0 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
29ec0 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
29ed0 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
29ee0 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
29ef0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
29f00 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
29f10 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
29f20 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
29f30 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
29f40 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
29f50 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
29f60 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
29f70 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
29f80 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
29f90 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29fa0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
29fb0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
29fc0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
29fd0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
29fe0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
29ff0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
2a000 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
2a010 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
2a020 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
2a030 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
2a040 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
2a050 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
2a060 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
2a070 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2a080 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
2a090 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
2a0a0 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
2a0b0 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
2a0c0 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
2a0d0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
2a0e0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
2a0f0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
2a100 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
2a110 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
2a120 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
2a130 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
2a140 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
2a150 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
2a160 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
2a170 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
2a180 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
2a190 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
2a1a0 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
2a1b0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
2a1c0 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
2a1d0 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
2a1e0 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
2a1f0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
2a200 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
2a210 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
2a220 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
2a230 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
2a240 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
2a250 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
2a260 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
2a270 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
2a280 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
2a290 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
2a2a0 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
2a2b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2a2c0 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
2a2d0 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
2a2e0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
2a2f0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
2a300 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
2a310 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
2a320 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
2a330 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
2a340 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
2a350 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
2a360 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
2a370 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
2a380 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
2a390 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2a3a0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
2a3b0 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
2a3c0 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
2a3d0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2a3e0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
2a3f0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
2a400 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
2a410 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
2a420 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
2a430 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
2a440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2a450 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
2a460 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
2a470 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
2a480 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a490 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
2a4a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a4b0 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
2a4c0 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
2a4d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2a4e0 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
2a4f0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
2a500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a510 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
2a520 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
2a530 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a540 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
2a550 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
2a560 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
2a570 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
2a580 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
2a590 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
2a5a0 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a5b0 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
2a5c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2a5d0 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
2a5e0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
2a5f0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
2a600 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2a610 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
2a620 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
2a630 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  n sqlite3_stricm
2a640 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2a650 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2a660 3f 20 32 20 3a 20 30 3b 0a 20 20 20 20 7d 65 6c  ? 2 : 0;.    }el
2a670 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
2a680 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
2a690 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
2a6a0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
2a6b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
2a6c0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
2a6d0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
2a6e0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2a6f0 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
2a700 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
2a710 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2a720 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
2a730 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
2a740 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
2a750 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
2a760 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a770 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a780 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a790 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a7a0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a7b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a7c0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a7d0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a7e0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a7f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a800 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a810 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a820 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a830 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a840 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41  urn 2;.    if( A
2a850 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
2a860 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a870 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70  d)==0) && pA->op
2a880 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  !=TK_STRING ){. 
2a890 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f       if( pA->iCo
2a8a0 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
2a8b0 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
2a8c0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62      if( pA->iTab
2a8d0 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a  le!=pB->iTable .
2a8e0 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69         && (pA->i
2a8f0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e  Table!=iTab || N
2a900 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e  EVER(pB->iTable>
2a910 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b  =0)) ) return 2;
2a920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a930 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2a940 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72  Compare two Expr
2a950 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52  List objects.  R
2a960 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20  eturn 0 if they 
2a970 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
2a980 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  d .** non-zero i
2a990 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
2a9a0 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2a9b0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
2a9c0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
2a9d0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
2a9e0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
2a9f0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
2aa00 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
2aa10 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
2aa20 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
2aa30 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
2aa40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
2aa50 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ight return non-
2aa60 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c  zero for equival
2aa70 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20  ent ExprLists.  
2aa80 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73  The.** only cons
2aa90 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20  equence will be 
2aaa0 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a  disabled optimiz
2aab0 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69  ations.  But thi
2aac0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73  s routine.** mus
2aad0 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30  t never return 0
2aae0 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72   if the two Expr
2aaf0 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65  List objects are
2ab00 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a   different, or.*
2ab10 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20  * a malfunction 
2ab20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a  will result..**.
2ab30 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ** Two NULL poin
2ab40 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ters are conside
2ab50 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61  red to be the sa
2ab60 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20  me.  But a NULL 
2ab70 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79  pointer.** alway
2ab80 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61  s differs from a
2ab90 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
2aba0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2abb0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2abc0 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45  (ExprList *pA, E
2abd0 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74  xprList *pB, int
2abe0 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iTab){.  int i;
2abf0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
2ac00 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
2ac10 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
2ac20 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
2ac30 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
2ac40 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
2ac50 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
2ac60 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
2ac70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
2ac80 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
2ac90 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
2aca0 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
2acb0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2acc0 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
2acd0 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
2ace0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
2acf0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
2ad00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ad10 61 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70  are(0, pExprA, p
2ad20 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
2ad30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2ad40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2ad50 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
2ad60 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65  prCompare() exce
2ad70 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  pt COLLATE opera
2ad80 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d  tors at the top-
2ad90 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e  level.** are ign
2ada0 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
2adb0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
2adc0 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78  kip(Expr *pA, Ex
2add0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
2ade0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2adf0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2ae00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2ae10 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2ae20 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20  llate(pA),.     
2ae30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ae40 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2ae50 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B),.            
2ae60 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iTab);.}../*.**
2ae70 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2ae80 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
2ae90 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
2aea0 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
2aeb0 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
2aec0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
2aed0 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
2aee0 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
2aef0 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
2af00 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
2af10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
2af20 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
2af30 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2af40 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2af50 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
2af60 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
2af70 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
2af80 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
2af90 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
2afa0 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
2afb0 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
2afc0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2afd0 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
2afe0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2aff0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2b000 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
2b010 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
2b020 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2b030 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b040 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
2b050 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b060 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
2b070 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
2b080 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
2b090 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2b0a0 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
2b0b0 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
2b0c0 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
2b0d0 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
2b0e0 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
2b0f0 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
2b100 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
2b110 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
2b120 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
2b130 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2b140 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2b150 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f  the values of bo
2b160 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e  und variables in
2b170 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d   pE1 are .** com
2b180 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69  pared against li
2b190 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20  teral values in 
2b1a0 70 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e  pE2 and pParse->
2b1b0 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69  pVdbe->expmask i
2b1c0 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f  s.** modified to
2b1d0 20 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f   record which bo
2b1e0 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72  und variables ar
2b1f0 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49  e referenced.  I
2b200 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20  f pParse .** is 
2b210 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65  NULL, then false
2b220 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2b230 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e  d if pE1 contain
2b240 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69  s any bound vari
2b250 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ables..**.** Whe
2b260 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
2b270 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  rn false.  Retur
2b280 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20  ning true might 
2b290 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
2b2a0 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
2b2b0 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  t.  Returning fa
2b2c0 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  lse might cause 
2b2d0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
2b2e0 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  duction, but.** 
2b2f0 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67  it will always g
2b300 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
2b310 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65  answer and is he
2b320 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e  nce always safe.
2b330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2b340 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50  xprImpliesExpr(P
2b350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2b360 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70  pr *pE1, Expr *p
2b370 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  E2, int iTab){. 
2b380 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b390 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2b3a0 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
2b3b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b3c0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b3d0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
2b3e0 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
2b3f0 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73  mpliesExpr(pPars
2b400 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65  e, pE1, pE2->pLe
2b410 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20  ft, iTab).      
2b420 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2b430 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2b440 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2b450 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
2b460 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
2b470 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2b480 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
2b490 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
2b4a0 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31  TK_ISNULL && pE1
2b4b0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20  ->op!=TK_IS ){. 
2b4c0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71     Expr *pX = sq
2b4d0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2b4e0 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29  late(pE1->pLeft)
2b4f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b500 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29  pX!=pE1->pLeft )
2b510 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2b520 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b530 72 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c  rse, pX, pE2->pL
2b540 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20  eft, iTab)==0 ) 
2b550 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2b560 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2b570 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45  ** This is the E
2b580 78 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63  xpr node callbac
2b590 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  k for sqlite3Exp
2b5a0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52  rImpliesNotNullR
2b5b0 6f 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ow()..** If the 
2b5c0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2b5d0 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
2b5e0 65 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b  e table at pWalk
2b5f0 65 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65  er->iCur.** have
2b600 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75   a non-NULL colu
2b610 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61  mn, then set pWa
2b620 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31  lker->eCode to 1
2b630 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73   and abort..*/.s
2b640 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65  tatic int implie
2b650 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b  sNotNullRow(Walk
2b660 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2b670 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2b680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2b690 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
2b6a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2b6b0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20  ressions and so 
2b6c0 69 74 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68  it.  ** cannot h
2b6d0 61 76 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43  ave any TK_AGG_C
2b6e0 4f 4c 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65  OLUMN entries be
2b6f0 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
2b700 6f 6e 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20  only found.  ** 
2b710 69 6e 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  in HAVING clause
2b720 73 2e 20 20 57 65 20 63 61 6e 20 67 65 74 20 61  s.  We can get a
2b730 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2b740 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
2b750 73 65 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61  se,.  ** but tha
2b760 74 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20  t is an illegal 
2b770 63 6f 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68  construct and th
2b780 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  e query will be 
2b790 72 65 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a  rejected at.  **
2b7a0 20 61 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f   a later stage o
2b7b0 66 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f  f processing, so
2b7c0 20 74 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43   the TK_AGG_FUNC
2b7d0 54 49 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e  TION case does n
2b7e0 6f 74 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ot.  ** need to 
2b7f0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65  be considered he
2b800 72 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  re. */.  assert(
2b810 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2b820 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74  GG_COLUMN );.  t
2b830 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b840 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2b850 49 4f 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78  ION );..  if( Ex
2b860 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2b870 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
2b880 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50  ) ) return WRC_P
2b890 72 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20  rune;.  switch( 
2b8a0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2b8b0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
2b8c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
2b8d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2b8e0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
2b8f0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
2b900 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
2b910 5f 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20  _CASE:.    case 
2b920 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20  TK_IN:.    case 
2b930 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
2b940 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b950 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
2b960 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b970 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b980 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  K_NOT );.      t
2b990 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b9a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
2b9b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b9c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2b9d0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
2b9e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b9f0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
2ba00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2ba10 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20  op==TK_CASE );. 
2ba20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ba30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2ba40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ba50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ba60 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
2ba70 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2ba80 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  une;.    case TK
2ba90 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69  _COLUMN:.      i
2baa0 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  f( pWalker->u.iC
2bab0 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  ur==pExpr->iTabl
2bac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61  e ){.        pWa
2bad0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2bae0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2baf0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2bb00 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2bb10 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20  WRC_Prune;..    
2bb20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
2bb30 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
2bb40 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   use constraints
2bb50 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53   like x=NULL.  S
2bb60 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20  o.    ** a term 
2bb70 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20  of the form x=y 
2bb80 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74  does not prove t
2bb90 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c  hat y is not nul
2bba0 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73  l if x.    ** is
2bbb0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   the column of a
2bbc0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2bbd0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  /.    case TK_EQ
2bbe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
2bbf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  :.    case TK_LT
2bc00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
2bc10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
2bc20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
2bc30 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
2bc40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bc50 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
2bc60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bc70 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
2bc80 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2bc90 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20  >op==TK_LT );.  
2bca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2bcb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29  xpr->op==TK_LE )
2bcc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bcd0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bce0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
2bcf0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2bd00 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
2bd10 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  if( (pExpr->pLef
2bd20 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2bd30 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45   && IsVirtual(pE
2bd40 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62  xpr->pLeft->pTab
2bd50 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45  )).       || (pE
2bd60 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d  xpr->pRight->op=
2bd70 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2bd80 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70  Virtual(pExpr->p
2bd90 52 69 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20  Right->pTab)).  
2bda0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65      ){.       re
2bdb0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2bdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61        }.    defa
2bdd0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2bde0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2bdf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2be00 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
2be10 72 6f 29 20 69 66 20 65 78 70 72 65 73 73 69 6f  ro) if expressio
2be20 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  n p can only be 
2be30 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
2be40 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  .** one column o
2be50 66 20 74 61 62 6c 65 20 69 54 61 62 20 69 73 20  f table iTab is 
2be60 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74  non-null.  In ot
2be70 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2be80 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70  n true.** if exp
2be90 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61  ression p will a
2bea0 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72  lways be NULL or
2beb0 20 66 61 6c 73 65 20 69 66 20 65 76 65 72 79 20   false if every 
2bec0 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a  column of iTab.*
2bed0 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
2bee0 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73   False negatives
2bef0 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e   are acceptable.
2bf00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2bf10 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65  , it is ok to re
2bf20 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65  turn.** zero eve
2bf30 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  n if expression 
2bf40 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  p will never be 
2bf50 74 72 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f  true of every co
2bf60 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2bf70 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73  is NULL.  A fals
2bf80 65 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65  e negative is me
2bf90 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70  rely a missed op
2bfa0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72  timization oppor
2bfb0 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61  tunity..**.** Fa
2bfc0 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 61 72  lse positives ar
2bfd0 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68  e not allowed, h
2bfe0 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65  owever.  A false
2bff0 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65   positive may re
2c000 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e  sult.** in an in
2c010 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a  correct answer..
2c020 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70  **.** Terms of p
2c030 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64   that are marked
2c040 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
2c050 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61  n (and hence tha
2c060 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74  t come from.** t
2c070 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2c080 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a  lauses of LEFT J
2c090 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64  OINS) are exclud
2c0a0 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c  ed from the anal
2c0b0 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ysis..**.** This
2c0c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2c0d0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c   to check if a L
2c0e0 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20  EFT JOIN can be 
2c0f0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a  converted into.*
2c100 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f  * an ordinary JO
2c110 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d  IN.  The p argum
2c120 65 6e 74 20 69 73 20 74 68 65 20 57 48 45 52 45  ent is the WHERE
2c130 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
2c140 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2c150 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 73   requires that s
2c160 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ome column of th
2c170 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2c180 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a   the LEFT JOIN.*
2c190 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  * be non-NULL, t
2c1a0 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49  hen the LEFT JOI
2c1b0 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  N can be safely 
2c1c0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2c1d0 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f  n.** ordinary jo
2c1e0 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  in..*/.int sqlit
2c1f0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
2c200 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c  NullRow(Expr *p,
2c210 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61   int iTab){.  Wa
2c220 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2c230 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c  rCallback = impl
2c240 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20  iesNotNullRow;. 
2c250 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2c260 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c  ck = 0;.  w.xSel
2c270 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
2c280 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b  ;.  w.eCode = 0;
2c290 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54  .  w.u.iCur = iT
2c2a0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ab;.  sqlite3Wal
2c2b0 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
2c2c0 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
2c2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
2c2e0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2c2f0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2c300 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
2c310 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
2c320 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   determine if an
2c330 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
2c340 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20  be evaluated by 
2c350 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2c360 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20  .** index only, 
2c370 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
2c380 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  o do a search fo
2c390 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
2c3a0 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74  ing.** table ent
2c3b0 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65  ry.  The IdxCove
2c3c0 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20  r.pIdx field is 
2c3d0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43  the index.  IdxC
2c3e0 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20  over.iCur.** is 
2c3f0 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  the cursor for t
2c400 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  he table..*/.str
2c410 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20  uct IdxCover {. 
2c420 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2c430 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2c440 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20  o be tested for 
2c450 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e  coverage */.  in
2c460 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f  t iCur;        /
2c470 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2c480 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f  for the table co
2c490 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
2c4a0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a  he index */.};..
2c4b0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
2c4c0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
2c4d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2c4e0 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a  lumns in table .
2c4f0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
2c500 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61  dxCover->iCur ca
2c510 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75  n be satisfied u
2c520 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  sing the index.*
2c530 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2c540 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f  xCover->pIdx..*/
2c550 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2c560 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20  IdxCover(Walker 
2c570 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2c580 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2c590 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2c5a0 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
2c5b0 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
2c5c0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2c5d0 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ur.   && sqlite3
2c5e0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57  ColumnOfIndex(pW
2c5f0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2c600 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  er->pIdx, pExpr-
2c610 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b  >iColumn)<0.  ){
2c620 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
2c630 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ode = 1;.    ret
2c640 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2c650 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2c660 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2c670 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
2c680 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e  an index pIdx on
2c690 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
2c6a0 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  or iCur contains
2c6b0 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70   will.** the exp
2c6c0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
2c6d0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2c6e0 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f  he index does co
2c6f0 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ver the.** expre
2c700 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20  ssion and false 
2c710 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70  if the pExpr exp
2c720 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63  ression referenc
2c730 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  es table columns
2c740 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74  .** that are not
2c750 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e   found in the in
2c760 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
2c770 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e  An index coverin
2c780 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
2c790 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
2c7a0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2c7b0 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73  .** evaluated us
2c7c0 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64  ing only the ind
2c7d0 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68  ex and without h
2c7e0 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20  aving to lookup 
2c7f0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
2c800 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79  ding table entry
2c810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c820 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
2c830 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ex(.  Expr *pExp
2c840 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
2c850 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
2c860 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ted */.  int iCu
2c870 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
2c880 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
2c890 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  r for the corres
2c8a0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f  ponding table */
2c8b0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
2c8c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2c8d0 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62  dex that might b
2c8e0 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  e used for cover
2c8f0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  age */.){.  Walk
2c900 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49  er w;.  struct I
2c910 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20  dxCover xcov;.  
2c920 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
2c930 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76  zeof(w));.  xcov
2c940 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
2c950 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78  xcov.pIdx = pIdx
2c960 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2c970 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76  ack = exprIdxCov
2c980 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f  er;.  w.u.pIdxCo
2c990 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73  ver = &xcov;.  s
2c9a0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2c9b0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74  w, pExpr);.  ret
2c9c0 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a  urn !w.eCode;.}.
2c9d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2c9e0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c9f0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2ca00 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2ca10 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2ca20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
2ca30 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
2ca40 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
2ca50 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
2ca60 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
2ca70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
2ca80 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
2ca90 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
2caa0 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
2cab0 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
2cac0 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
2cad0 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
2cae0 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
2caf0 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
2cb00 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
2cb10 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
2cb20 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2cb30 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2cb40 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
2cb50 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
2cb60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cb70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2cb80 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
2cb90 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
2cba0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
2cbb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2cbc0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2cbd0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
2cbe0 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
2cbf0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2cc00 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2cc10 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
2cc20 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
2cc30 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
2cc40 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2cc50 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
2cc60 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
2cc70 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
2cc80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2cc90 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
2cca0 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
2ccb0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
2ccc0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
2ccd0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
2cce0 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
2ccf0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2cd00 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
2cd10 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
2cd20 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
2cd30 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
2cd40 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
2cd50 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
2cd60 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cd70 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
2cd80 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2cd90 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
2cda0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
2cdb0 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
2cdc0 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
2cdd0 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
2cde0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2cdf0 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53     int nSrc = pS
2ce00 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20  rc ? pSrc->nSrc 
2ce10 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
2ce20 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
2ce30 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2ce40 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
2ce50 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
2ce60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2ce70 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20  f( i<nSrc ){.   
2ce80 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
2ce90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cea0 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
2ceb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2cec0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ced0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2cee0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
2cef0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
2cf00 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
2cf10 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
2cf20 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
2cf30 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
2cf40 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
2cf50 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
2cf60 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
2cf70 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
2cf80 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
2cf90 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
2cfa0 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
2cfb0 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
2cfc0 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
2cfd0 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
2cfe0 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
2cff0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
2d000 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2d010 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
2d020 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
2d030 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d040 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2d050 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
2d060 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2d070 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77  _FUNCTION );.  w
2d080 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d090 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
2d0a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d0b0 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  ck = 0;.  w.u.pS
2d0c0 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a  rcCount = &cnt;.
2d0d0 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72    cnt.pSrc = pSr
2d0e0 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68  cList;.  cnt.nTh
2d0f0 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f  is = 0;.  cnt.nO
2d100 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ther = 0;.  sqli
2d110 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
2d120 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  &w, pExpr->x.pLi
2d130 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
2d140 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74  t.nThis>0 || cnt
2d150 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f  .nOther==0;.}../
2d160 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
2d170 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
2d180 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
2d190 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2d1a0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2d1b0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2d1c0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2d1d0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2d1e0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2d1f0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2d200 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
2d210 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2d220 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2d230 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
2d240 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
2d250 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
2d260 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2d270 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
2d280 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
2d290 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2d2a0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
2d2b0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2d2c0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2d2d0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2d2e0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2d2f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
2d300 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2d310 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2d320 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2d330 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2d340 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2d350 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2d360 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2d370 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
2d380 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2d390 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2d3a0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
2d3b0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2d3c0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
2d3d0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2d3e0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
2d3f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
2d400 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2d410 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
2d420 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2d430 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2d440 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2d450 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
2d460 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
2d470 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
2d480 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
2d490 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d4a0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
2d4b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2d4c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
2d4d0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
2d4e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2d4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2d500 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
2d510 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2d520 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
2d530 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
2d540 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
2d550 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
2d560 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
2d570 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
2d580 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
2d590 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
2d5a0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2d5b0 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67  o = pNC->uNC.pAg
2d5c0 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74  gInfo;..  assert
2d5d0 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
2d5e0 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a   NC_UAggInfo );.
2d5f0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2d600 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2d610 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
2d620 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
2d630 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
2d640 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2d650 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2d660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2d670 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2d680 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
2d690 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2d6a0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
2d6b0 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
2d6c0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2d6d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
2d6e0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
2d6f0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
2d700 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
2d710 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
2d720 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2d730 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2d740 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
2d750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2d760 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
2d770 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2d780 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2d790 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2d7a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
2d7b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2d7c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2d7d0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d7e0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2d7f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2d800 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2d810 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
2d820 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
2d830 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
2d840 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
2d850 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
2d860 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
2d870 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
2d880 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2d890 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2d8a0 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
2d8b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2d8c0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
2d8d0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
2d8e0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
2d8f0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
2d900 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2d910 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
2d920 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
2d930 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d940 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
2d950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2d960 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
2d970 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
2d980 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
2d990 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
2d9a0 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
2d9b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2d9c0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
2d9d0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9f0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
2da00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
2da10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2da30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2da50 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
2da60 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
2da70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
2da80 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
2da90 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
2daa0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
2dab0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2dac0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2dad0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
2dae0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
2daf0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
2db00 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
2db10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2db20 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
2db30 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
2db40 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2db50 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
2db60 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2db70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
2db80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2db90 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
2dba0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2dbb0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2dbc0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2dbd0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2dbf0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2dc00 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
2dc10 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc30 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
2dc40 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2dc50 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
2dc60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2dc70 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
2dc80 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
2dc90 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
2dca0 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
2dcb0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2dcc0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
2dcd0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
2dce0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
2dcf0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
2dd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2dd10 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2dd20 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
2dd30 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2dd40 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd60 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
2dd70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd90 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2dda0 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2ddd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dde0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ddf0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2de00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2de10 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2de20 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
2de30 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2de40 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
2de50 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
2de60 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
2de70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de90 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2dea0 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
2deb0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
2dec0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
2ded0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
2dee0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
2def0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
2df00 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
2df10 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
2df20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
2df30 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
2df40 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
2df50 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
2df60 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
2df70 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
2df80 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
2df90 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2dfa0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
2dfb0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2dfc0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2dfd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2dfe0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2dff0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2e000 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
2e010 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
2e020 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e030 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
2e040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2e050 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2e060 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
2e070 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2e080 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
2e090 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
2e0a0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
2e0b0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
2e0c0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2e0d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2e0e0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2e0f0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
2e100 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2e110 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
2e120 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
2e130 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
2e140 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
2e150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
2e160 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
2e170 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
2e180 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
2e190 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
2e1a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
2e1b0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
2e1c0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
2e1d0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
2e1e0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
2e1f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e200 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
2e210 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
2e220 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2e230 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2e240 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2e250 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e260 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
2e270 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
2e280 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
2e290 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e2a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2e2c0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
2e2d0 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
2e2e0 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
2e2f0 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
2e300 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
2e310 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
2e320 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e330 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
2e340 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
2e350 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
2e360 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
2e370 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2e380 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
2e390 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
2e3a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2e3b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e3c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2e3d0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
2e3e0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
2e3f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2e410 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2e420 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
2e430 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
2e440 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2e450 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e460 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e470 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
2e480 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2e490 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
2e4a0 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
2e4b0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
2e4c0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2e4d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
2e4e0 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20  zToken, .       
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e500 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
2e510 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2e520 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
2e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e540 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
2e550 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2e570 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2e580 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2e590 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2e5a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2e5b0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2e5c0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
2e5d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e5e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e5f0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
2e600 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
2e610 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
2e620 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
2e630 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
2e640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e650 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e660 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2e670 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2e680 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
2e690 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2e6a0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2e6b0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2e6c0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
2e6d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2e6e0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2e6f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
2e700 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2e710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e720 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
2e730 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2e740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e750 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2e760 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
2e770 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2e780 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
2e790 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2e7a0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2e7b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2e7c0 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2e7d0 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b  r->walkerDepth++
2e7e0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2e7f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2e800 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67  c void analyzeAg
2e810 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2e820 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  End(Walker *pWal
2e830 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2e840 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2e850 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2e860 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2e870 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a  alkerDepth--;.}.
2e880 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
2e890 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
2e8a0 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
2e8b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2e8c0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
2e8d0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
2e8e0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
2e8f0 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
2e900 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
2e910 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
2e920 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
2e930 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
2e940 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
2e950 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
2e960 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
2e970 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2e980 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
2e990 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
2e9a0 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
2e9b0 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
2e9c0 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
2e9d0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
2e9e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2e9f0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
2ea00 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2ea10 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
2ea20 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2ea30 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
2ea40 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
2ea50 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2ea60 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2ea70 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
2ea80 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2ea90 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ck2 = analyzeAgg
2eaa0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2eab0 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65  nd;.  w.walkerDe
2eac0 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70  pth = 0;.  w.u.p
2ead0 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65  NC = pNC;.  asse
2eae0 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
2eaf0 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
2eb00 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2eb10 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
2eb20 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
2eb30 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2eb40 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
2eb50 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
2eb60 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2eb70 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
2eb80 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
2eb90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2eba0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
2ebb0 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
2ebc0 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
2ebd0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2ebe0 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
2ebf0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
2ec00 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
2ec10 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2ec20 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
2ec30 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2ec40 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
2ec50 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
2ec60 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2ec70 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2ec80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ec90 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2eca0 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
2ecb0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2ecc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2ecd0 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
2ece0 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
2ecf0 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
2ed00 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
2ed10 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ed20 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
2ed30 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
2ed40 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
2ed50 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
2ed60 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
2ed70 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2ed80 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2ed90 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
2eda0 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
2edb0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
2edc0 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
2edd0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
2ede0 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2edf0 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a  .** purpose..**.
2ee00 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
2ee10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
2ee20 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20  ing used by the 
2ee30 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68  column cache, th
2ee40 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f  en.** the deallo
2ee50 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  cation is deferr
2ee60 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c  ed until the col
2ee70 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74  umn cache line t
2ee80 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20  hat uses.** the 
2ee90 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73  register becomes
2eea0 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   stale..*/.void 
2eeb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2eec0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2eed0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
2eee0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
2eef0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
2ef00 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
2ef10 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
2ef20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
2ef30 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
2ef40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
2ef50 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
2ef60 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
2ef70 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
2ef80 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
2ef90 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
2efa0 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65         p->tempRe
2efb0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  g = 1;.        r
2efc0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
2efd0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
2efe0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
2eff0 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
2f000 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2f010 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
2f020 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
2f030 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
2f040 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e  utive registers.
2f050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2f060 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
2f070 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
2f080 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
2f090 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  ;.  if( nReg==1 
2f0a0 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ) return sqlite3
2f0b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2f0c0 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65  e);.  i = pParse
2f0d0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2f0e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2f0f0 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2f100 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2f110 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2f120 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2f130 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2f140 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f150 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2f160 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2f170 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2f180 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2f190 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2f1a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2f1b0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2f1c0 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2f1d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2f1e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2f1f0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2f200 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65  nReg){.  if( nRe
2f210 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==1 ){.    sqli
2f220 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2f230 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b  g(pParse, iReg);
2f240 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2f250 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2f260 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
2f270 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
2f280 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
2f290 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
2f2a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2f2b0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
2f2c0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2f2d0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
2f2e0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
2f2f0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2f300 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
2f310 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2f320 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
2f330 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2f340 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
2f350 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
2f360 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
2f370 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f380 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2f390 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f  Validate that no
2f3a0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2f3b0 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e  ter falls within
2f3c0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
2f3d0 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20   iFirst..iLast, 
2f3e0 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73  inclusive.  This
2f3f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2f400 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69   call from withi
2f410 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  n assert().** st
2f420 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66  atements..*/.#if
2f430 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2f440 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65  .int sqlite3NoTe
2f450 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65  mpsInRange(Parse
2f460 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
2f470 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29  irst, int iLast)
2f480 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2f490 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2f4a0 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73  eg>0.   && pPars
2f4b0 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61  e->iRangeReg+pPa
2f4c0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e  rse->nRangeReg >
2f4d0 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50   iFirst.   && pP
2f4e0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2f4f0 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20  <= iLast.  ){.  
2f500 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2f510 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2f520 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2f530 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2f540 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2f550 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2f560 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2f570 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2f580 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2f590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2f5a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f5b0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.