/ Hex Artifact Content
Login

Artifact 2448a255ce627c4e772bd68cf5529877c2bdfb6b580803d5fadc8528bdf7c1ef:


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 62  ab;.    pItem->b
b4b0: 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64  SorterRef = pOld
b4c0: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b4d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b4e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
b510: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
b520: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
b530: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
b540: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
b550: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
b560: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
b570: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
b580: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
b590: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
b5a0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
b5b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b5c0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
b5d0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
b5e0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
b5f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
b600: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
b610: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b620: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b630: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
b640: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b650: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
b660: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b670: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
b680: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
b690: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
b6a0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b6b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b6c0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
b6d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b6e0: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
b6f0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
b700: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
b710: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
b720: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
b730: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b740: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b750: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
b760: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b770: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
b780: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
b790: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
b7a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
b7b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
b7c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b7d0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
b7e0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
b7f0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b800: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b810: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
b820: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
b830: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
b840: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
b850: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
b860: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
b870: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b880: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
b890: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
b8a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b8c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b8d0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8e0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
b8f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b900: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
b910: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
b920: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
b930: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b940: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
b950: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
b960: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
b970: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
b980: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
b990: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
b9a0: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
b9b0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
b9c0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b9d0: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
b9e0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ba10: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ba20: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
ba30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
ba40: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
ba50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
ba60: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
ba70: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
ba80: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
ba90: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
baa0: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
bab0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bac0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bad0: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
bae0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
baf0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
bb00: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
bb10: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
bb20: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
bb30: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
bb40: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
bb50: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
bb60: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
bb70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
bb80: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
bb90: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
bba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bbb0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
bbc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bbd0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
bbe0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
bbf0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bc00: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
bc10: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
bc20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
bc30: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
bc40: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
bc50: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
bc60: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
bc70: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
bc80: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
bc90: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
bca0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
bcb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
bcc0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
bcd0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
bce0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
bcf0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
bd00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
bd10: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
bd20: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
bd30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
bd40: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
bd50: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
bd60: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
bd70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
bd80: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77  bFreeNN(db, pNew
bd90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
bda0: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
bdb0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
bdc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
bdd0: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
bde0: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
bdf0: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
be00: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
be10: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
be20: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
be30: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
be40: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
be50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
be60: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
be70: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
be80: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
be90: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bea0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
beb0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
bec0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
bed0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
bee0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
bef0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
bf00: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bf10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
bf20: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
bf30: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
bf40: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
bf50: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bf60: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bf70: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bf80: 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Dup, int flags){
bf90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20  .  Select *pRet 
bfa0: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
bfb0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Next = 0;.  Sele
bfc0: 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ct **pp = &pRet;
bfd0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20  .  Select *p;.. 
bfe0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bff0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20  ;.  for(p=pDup; 
c000: 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b  p; p=p->pPrior){
c010: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
c020: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c030: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c040: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69  eof(*p) );.    i
c050: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65  f( pNew==0 ) bre
c060: 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  ak;.    pNew->pE
c070: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c080: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c090: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
c0a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  .    pNew->pSrc 
c0b0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
c0c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
c0d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c0e0: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
c0f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c100: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
c110: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
c120: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
c130: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c140: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
c150: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61  );.    pNew->pHa
c160: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
c170: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
c180: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
c190: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
c1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c1b0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
c1c0: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
c1d0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d     pNew->op = p-
c1e0: 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  >op;.    pNew->p
c1f0: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
c200: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
c210: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c   0;.    pNew->pL
c220: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
c230: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
c240: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  mit, flags);.   
c250: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
c260: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
c270: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
c280: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
c290: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
c2a0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
c2b0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c2c0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
c2d0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c2e0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
c2f0: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
c300: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
c310: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
c320: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
c330: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
c340: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c350: 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d  SetName(pNew, p-
c360: 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
c370: 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  *pp = pNew;.    
c380: 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69  pp = &pNew->pPri
c390: 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  or;.    pNext = 
c3a0: 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pNew;.  }..  ret
c3b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
c3c0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
c3d0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c3e0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c3f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c400: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
c410: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
c420: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
c430: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
c440: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
c450: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c460: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
c470: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
c480: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
c490: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
c4a0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ist..**.** The p
c4b0: 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  List argument mu
c4c0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55 4c  st be either NUL
c4d0: 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  L or a pointer t
c4e0: 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a  o an ExprList.**
c4f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
c500: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
c510: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c520: 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72 6f  pend().  This ro
c530: 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74  utine.** may not
c540: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
c550: 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69 6e   ExprList obtain
c560: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ed from sqlite3E
c570: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c580: 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20 72   Reason:  This r
c590: 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74  outine assumes t
c5a0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
c5b0: 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74  f slots in pList
c5c0: 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f  ->a[].** is a po
c5d0: 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61  wer of two.  Tha
c5e0: 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73 71  t is true for sq
c5f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
c600: 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a  end() returns.**
c610: 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63 65   but is not nece
c620: 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72 6f  ssarily true fro
c630: 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  m the return val
c640: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78 70  ue of sqlite3Exp
c650: 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a  rListDup()..**.*
c660: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c670: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c680: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c690: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c6a0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c6b0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c6c0: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c6d0: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c6e0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c6f0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c700: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c710: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c720: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c730: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c750: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c760: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c770: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c790: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c7a0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c7b0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c7c0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c7d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c7e0: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c7f0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c800: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c810: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c830: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c840: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c850: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c860: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c870: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c880: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c890: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c8a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c8b0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c8d0: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d  ->nExpr = 0;.  }
c8e0: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
c8f0: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
c900: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
c910: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
c920: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
c930: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
c940: 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20  (db, pList, .   
c950: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
c960: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73  (*pList)+(2*pLis
c970: 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73 69  t->nExpr - 1)*si
c980: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c990: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
c9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c9b0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c9c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
c9d0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
c9e0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
c9f0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73  >nExpr++];.  ass
ca00: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74  ert( offsetof(st
ca10: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ca20: 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f  em,zName)==sizeo
ca30: 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  f(pItem->pExpr) 
ca40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
ca50: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
ca60: 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72  rList_item,pExpr
ca70: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  )==0 );.  memset
ca80: 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30  (&pItem->zName,0
ca90: 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d  ,sizeof(*pItem)-
caa0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cab0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
cac0: 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  ame));.  pItem->
cad0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
cae0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
caf0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
cb00: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
cb10: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
cb20: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
cb30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
cb40: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
cb50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
cb60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
cb70: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
cb80: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
cb90: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
cba0: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
cbb0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
cbc0: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
cbd0: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
cbe0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
cbf0: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
cc00: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
cc10: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
cc20: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
cc30: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
cc40: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
cc50: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
cc60: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
cc70: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
cc80: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
cc90: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
cca0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
ccb0: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
ccc0: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
ccd0: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
cce0: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
ccf0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
cd00: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
cd10: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
cd20: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
cd30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cd40: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
cd50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cd60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cd70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
cd80: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
cd90: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
cda0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
cdb0: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
cdc0: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
cdd0: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
cde0: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
cdf0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
ce00: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
ce10: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
ce20: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
ce30: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
ce40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ce50: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
ce60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
ce70: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
ce80: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
ce90: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
cea0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
ceb0: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
cec0: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
ced0: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
cee0: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
cef0: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
cf00: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
cf10: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
cf20: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
cf30: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
cf40: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
cf50: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
cf60: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
cf70: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
cf80: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
cf90: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
cfa0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
cfb0: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
cfc0: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
cfd0: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
cfe0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
cff0: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
d000: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
d010: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d020: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
d030: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
d040: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
d050: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
d060: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
d070: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
d080: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
d090: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
d0a0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
d0b0: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
d0c0: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
d0d0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d0e0: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
d0f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d100: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
d110: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
d120: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
d130: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
d140: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
d150: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
d160: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
d170: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
d180: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
d190: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
d1a0: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
d1b0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
d1c0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
d1d0: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
d1e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d1f0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
d200: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
d210: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
d220: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d230: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
d240: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
d250: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
d260: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
d270: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
d280: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
d290: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d2a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
d2b0: 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   }..  if( !db->m
d2c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70  allocFailed && p
d2d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
d2e0: 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c  ECT && ALWAYS(pL
d2f0: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45  ist!=0) ){.    E
d300: 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c  xpr *pFirst = pL
d310: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70  ist->a[iFirst].p
d320: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
d330: 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20  ( pFirst!=0 );. 
d340: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
d350: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
d360: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
d370: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
d380: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d390: 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20  nt in pRight so 
d3a0: 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  it will be delet
d3b0: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73  ed when.    ** s
d3c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d3d0: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
d3e0: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
d3f0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
d400: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a      pExpr = 0;..
d410: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
d420: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d430: 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f  LHS in iTable so
d440: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65   that we can che
d450: 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ck that.    ** t
d460: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
d470: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
d480: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
d490: 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  n. */.    pFirst
d4a0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75  ->iTable = pColu
d4b0: 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76  mns->nId;.  }..v
d4c0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d4d0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
d4e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
d4f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
d500: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d510: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
d520: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d530: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
d540: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
d550: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
d560: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
d570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d580: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
d590: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
d5a0: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
d5b0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
d5c0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
d5d0: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
d5e0: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
d5f0: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
d600: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
d610: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d620: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
d630: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
d640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d650: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d660: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
d670: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
d680: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
d690: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d6a0: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
d6b0: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
d6c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
d6d0: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
d6e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
d6f0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
d700: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
d710: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
d720: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
d730: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
d740: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
d750: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
d760: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
d770: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
d780: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
d790: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
d7a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d7b0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
d7c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d7d0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
d7e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d7f0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d800: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d810: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d820: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
d830: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
d840: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
d850: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
d860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
d870: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
d880: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d8a0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
d8b0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
d8c0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
d8d0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
d8e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
d8f0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d900: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d910: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d920: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
d930: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d940: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
d950: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d960: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d970: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
d980: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
d990: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
d9a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
d9b0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
d9c0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
d9d0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
d9e0: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
d9f0: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
da00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
da10: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
da20: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
da30: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
da40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
da50: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
da60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
da70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
da80: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
da90: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
daa0: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
dab0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
dac0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
dad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
dae0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
daf0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
db00: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
db10: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
db20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
db30: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
db40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
db50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
db60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
db70: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
db80: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
db90: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
dba0: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
dbb0: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f  r *zStart,     /
dbc0: 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73  * Start of the s
dbd0: 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pan */.  const c
dbe0: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
dbf0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73   /* End of the s
dc00: 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  pan */.){.  sqli
dc10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
dc20: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
dc30: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
dc40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
dc50: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
dc60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
dc70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dc80: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
dc90: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
dca0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
dcb0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
dcc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dcd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
dce0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
dcf0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70  an = sqlite3DbSp
dd00: 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  anDup(db, zStart
dd10: 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zEnd);.  }.}..
dd20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
dd30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
dd40: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
dd50: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
dd60: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
dd70: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
dd80: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
dd90: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
dda0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
ddb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ddc0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
ddd0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
dde0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
ddf0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
de00: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
de10: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
de20: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
de30: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
de40: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
de50: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
de60: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
de70: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
de80: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de90: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
dea0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
deb0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
dec0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
ded0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
dee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
def0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
df00: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
df10: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
df20: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
df30: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
df40: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
df50: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
df60: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
df70: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
df80: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
df90: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
dfa0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
dfb0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
dfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
dfd0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
dfe0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
dff0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e000: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
e010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e020: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e030: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
e040: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
e050: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
e060: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
e070: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
e080: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
e090: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
e0a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e0b0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
e0c0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
e0d0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
e0e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
e0f0: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
e100: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
e110: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
e120: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
e130: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
e140: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
e150: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e160: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
e170: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
e180: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f  pList!=0 );.  fo
e190: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
e1a0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e1b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
e1c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e1d0: 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20  r;.     assert( 
e1e0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
e1f0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
e200: 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  gs;.  }.  return
e210: 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   m;.}../*.** Thi
e220: 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f  s is a SELECT-no
e230: 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
e240: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
e250: 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c  alker that.** al
e260: 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42  ways "fails".  B
e270: 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73  y "fail" in this
e280: 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73   case, we mean s
e290: 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65  et.** pWalker->e
e2a0: 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64  Code to zero and
e2b0: 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   abort..**.** Th
e2c0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75  is callback is u
e2d0: 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  sed by multiple 
e2e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
e2f0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
e300: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
e310: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
e320: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
e330: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
e340: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
e350: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
e360: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
e370: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a  WRC_Abort;.}../*
e380: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
e390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e3a0: 6e 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61  n ID with the na
e3b0: 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61  me "true" or "fa
e3c0: 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e  lse".** then con
e3d0: 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20  vert it into an 
e3e0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72  TK_TRUEFALSE ter
e3f0: 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  m.  Return non-z
e400: 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ero if.** the co
e410: 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65  nversion happene
e420: 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74  d, and zero if t
e430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e440: 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69   unaltered..*/.i
e450: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  nt sqlite3ExprId
e460: 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72  ToTrueFalse(Expr
e470: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
e480: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e490: 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_ID || pExpr->o
e4a0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
e4b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
e4c0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
e4d0: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
e4e0: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  .   || sqlite3St
e4f0: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
e500: 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d  Token, "false")=
e510: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  =0.  ){.    pExp
e520: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46  r->op = TK_TRUEF
e530: 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALSE;.    return
e540: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
e550: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
e560: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
e570: 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  e a TK_TRUEFALSE
e580: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74   Expr node.  Ret
e590: 75 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54  urn 1 if it is T
e5a0: 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  RUE.** and 0 if 
e5b0: 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a  it is FALSE..*/.
e5c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54  int sqlite3ExprT
e5d0: 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20  ruthValue(const 
e5e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
e5f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e600: 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p==TK_TRUEFALSE 
e610: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e620: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e630: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75  r->u.zToken,"tru
e640: 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e")==0.       ||
e650: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e660: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
e670: 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20  "false")==0 );. 
e680: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75   return pExpr->u
e690: 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d  .zToken[4]==0;.}
e6a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  .../*.** These r
e6b0: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
e6c0: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65  er callbacks use
e6d0: 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65  d to check expre
e6e0: 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65  ssions to.** see
e6f0: 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f   if they are "co
e700: 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65  nstant" for some
e710: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63   definition of c
e720: 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a  onstant.  The.**
e730: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
e740: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
e750: 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73  he type of "cons
e760: 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f  tant" we are loo
e770: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a  king.** for..**.
e780: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
e790: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
e7a0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
e7b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e7c0: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
e7d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e7e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
e7f0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e800: 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==1.**     sqli
e810: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e820: 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20  tNotJoin()      
e830: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e840: 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71  ode==2.**     sq
e850: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
e860: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
e870: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e880: 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20  eCode==3.**     
e890: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e8a0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
e8b0: 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  )        pWalker
e8c0: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a  ->eCode==4 or 5.
e8d0: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  **.** In all cas
e8e0: 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  es, the callback
e8f0: 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  s set Walker.eCo
e900: 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69  de=0 and abort i
e910: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e920: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  .** is found to 
e930: 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  not be a constan
e940: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
e950: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e960: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69  ntOrFunction() i
e970: 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75  s used for evalu
e980: 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ating expression
e990: 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  s.** in a CREATE
e9a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e9b0: 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43  .  The Walker.eC
e9c0: 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77  ode value is 5 w
e9d0: 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61  hen parsing.** a
e9e0: 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  n existing schem
e9f0: 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f  a and 4 when pro
ea00: 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74  cessing a new st
ea10: 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e  atement.  A boun
ea20: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72  d.** parameter r
ea30: 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66  aises an error f
ea40: 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  or new statement
ea50: 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74  s, but is silent
ea60: 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ly converted.** 
ea70: 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73  to NULL for exis
ea80: 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54  ting schemas.  T
ea90: 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74  his allows sqlit
eaa0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
eab0: 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  that .** contain
eac0: 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   a bound paramet
ead0: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20  er because they 
eae0: 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62  were generated b
eaf0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
eb00: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f  .** of SQLite to
eb10: 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65   be parsed by ne
eb20: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
eb30: 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72  SQLite without r
eb40: 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66  aising a.** malf
eb50: 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72  ormed schema err
eb60: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
eb70: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
eb80: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
eb90: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
eba0: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
ebb0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32  lker->eCode is 2
ebc0: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
ebd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ebe0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
ebf0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
ec00: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
ec10: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73   a left join dis
ec20: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
ec30: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
ec40: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
ec50: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
ec60: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
ec70: 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72  eCode==2 && Expr
ec80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ec90: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
eca0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
ecb0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
ecc0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ecd0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
ece0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
ecf0: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
ed00: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
ed10: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
ed20: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
ed30: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
ed40: 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c   and either pWal
ed50: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
ed60: 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69   5 or the functi
ed70: 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  on has the.    *
ed80: 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  * SQLITE_FUNC_CO
ed90: 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  NST flag. */.   
eda0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
edb0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
edc0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c  lker->eCode>=4 |
edd0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
ede0: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
edf0: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
ee00: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
ee10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
ee20: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
ee30: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ee40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
ee50: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
ee60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
ee70: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
ee80: 74 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  t "true" or "fal
ee90: 73 65 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54  se" in a DEFAULT
eea0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65   clause into the
eeb0: 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70  .      ** approp
eec0: 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c  riate TK_TRUEFAL
eed0: 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  SE operator */. 
eee0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
eef0: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
ef00: 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
ef10: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
ef20: 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
ef30: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
ef40: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
ef50: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
ef60: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
ef70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
ef80: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
ef90: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
efa0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
efb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
efc0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
efd0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      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 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
f000: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f010: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f020: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
f030: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
f040: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
f050: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
f060: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
f070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f080: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
f090: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f0a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f0b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
f0c0: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 20 20 74 65  LL_ROW:.      te
f0d0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f0e0: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
f0f0: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
f100: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f110: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
f120: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
f130: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
f140: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f150: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
f160: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
f170: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
f180: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
f190: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
f1a0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
f1b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
f1c0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
f1d0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
f1e0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
f1f0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
f200: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f210: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
f220: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
f230: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
f240: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
f250: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
f260: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
f270: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
f280: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f290: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
f2a0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
f2b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
f2c0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
f2d0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
f2e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f2f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f300: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
f310: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
f320: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
f330: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
f340: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f350: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
f360: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
f370: 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20  ctWalkFail will 
f380: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
f390: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f3a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
f3b0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
f3c0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c  lectWalkFail wil
f3d0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
f3e0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
f3f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
f400: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73  tatic int exprIs
f410: 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69  Const(Expr *p, i
f420: 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74  nt initFlag, int
f430: 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72   iCur){.  Walker
f440: 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   w;.  w.eCode = 
f450: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
f460: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
f470: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
f480: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
f490: 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
f4a0: 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23  electWalkFail;.#
f4b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
f4c0: 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  UG.  w.xSelectCa
f4d0: 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65  llback2 = sqlite
f4e0: 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
f4f0: 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75  t2;.#endif.  w.u
f500: 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
f510: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
f520: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
f530: 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
f540: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
f550: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
f560: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
f570: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
f580: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
f590: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
f5a0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
f5b0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
f5c0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
f5d0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
f5e0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
f5f0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
f600: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
f610: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
f620: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
f630: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
f640: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
f650: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
f660: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f670: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
f680: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
f690: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
f6a0: 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1, 0);.}../*.** 
f6b0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
f6c0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
f6d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
f6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
f6f0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
f700: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
f710: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
f720: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
f730: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
f740: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
f750: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
f760: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
f770: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
f780: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
f790: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
f7a0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f7b0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
f7c0: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
f7d0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
f7e0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
f7f0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f800: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f810: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
f820: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
f830: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
f840: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
f850: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
f860: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
f870: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
f880: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
f890: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
f8a0: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
f8b0: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
f8c0: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
f8d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
f8e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f8f0: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
f900: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
f910: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
f920: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
f930: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a  3, iCur);.}.../*
f940: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
f950: 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
f960: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  sed by sqlite3Ex
f970: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
f980: 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74  oupBy()..*/.stat
f990: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f9a0: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f9b0: 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  By(Walker *pWalk
f9c0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
f9d0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  {.  ExprList *pG
f9e0: 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72  roupBy = pWalker
f9f0: 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20  ->u.pGroupBy;.  
fa00: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65  int i;..  /* Che
fa10: 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69  ck if pExpr is i
fa20: 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20  dentical to any 
fa30: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49  GROUP BY term. I
fa40: 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20  f so, consider. 
fa50: 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e   ** it constant.
fa60: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
fa70: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
fa80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
fa90: 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d  r *p = pGroupBy-
faa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
fab0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
fac0: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
fad0: 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
fae0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
faf0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
fb00: 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65  NNCollSeq(pWalke
fb10: 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  r->pParse, p);. 
fb20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
fb30: 5f 73 74 72 69 63 6d 70 28 22 42 49 4e 41 52 59  _stricmp("BINARY
fb40: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
fb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
fb60: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
fb70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fb80: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
fb90: 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
fba0: 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20  -select. If so, 
fbb0: 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61 72 69  consider it vari
fbc0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45  able. */.  if( E
fbd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fbe0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
fbf0: 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  ct) ){.    pWalk
fc00: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fc10: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
fc20: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ort;.  }..  retu
fc30: 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  rn exprNodeIsCon
fc40: 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70  stant(pWalker, p
fc50: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
fc60: 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73  Walk the express
fc70: 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64 20  ion tree passed 
fc80: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
fc90: 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f  ument. Return no
fca0: 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65  n-zero.** if the
fcb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73   expression cons
fcc0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
fcd0: 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f   constants or co
fce0: 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a  pies of terms .*
fcf0: 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68  * in pGroupBy th
fd00: 61 74 20 73 6f 72 74 20 77 69 74 68 20 74 68 65  at sort with the
fd10: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
fd20: 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  n sequence..**.*
fd30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fd40: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
fd50: 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66  ine if a term of
fd60: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
fd70: 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f  se can.** be pro
fd80: 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57  moted into the W
fd90: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e  HERE clause.  In
fda0: 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63 68 20   order for such 
fdb0: 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77  a promotion to w
fdc0: 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ork,.** the valu
fdd0: 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  e of the HAVING 
fde0: 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74  clause term must
fdf0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72   be the same for
fe00: 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a   all members of.
fe10: 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54  ** a "group".  T
fe20: 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
fe30: 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
fe40: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49   term must be BI
fe50: 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20  NARY.** assumes 
fe60: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
fe70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fe80: 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e   will have a fin
fe90: 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72  er-grained.** gr
fea0: 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61  ouping than bina
feb0: 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
fec0: 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45  rds (A=B COLLATE
fed0: 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73   binary) implies
fee0: 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79  .** A=B in every
fef0: 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67   other collating
ff00: 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
ff10: 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
ff20: 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
ff30: 20 62 65 20 42 49 4e 41 52 59 20 69 73 20 73 74   be BINARY is st
ff40: 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65  ricter than nece
ff50: 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64  ssary.  It would
ff60: 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f   also work.** to
ff70: 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20   promote HAVING 
ff80: 63 6c 61 75 73 65 73 20 74 68 61 74 20 75 73 65  clauses that use
ff90: 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e   the same altern
ffa0: 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  ative collating.
ffb0: 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 20 74  ** sequence as t
ffc0: 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
ffd0: 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6d 75  , but that is mu
ffe0: 63 68 20 68 61 72 64 65 72 20 74 6f 20 63 68 65  ch harder to che
fff0: 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69  ck,.** alternati
10000 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
10010 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d  uences are uncom
10020 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73  mon, and this is
10030 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69   only an.** opti
10040 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  mization, so we 
10050 74 61 6b 65 20 74 68 65 20 65 61 73 79 20 77 61  take the easy wa
10060 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79  y out and simply
10070 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20   require the.** 
10080 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20  GROUP BY to use 
10090 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
100a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
100b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
100c0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
100d0 75 70 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  upBy(Parse *pPar
100e0 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70  se, Expr *p, Exp
100f0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29  rList *pGroupBy)
10100 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
10110 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
10120 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
10130 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10140 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20  antOrGroupBy;.  
10150 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10160 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72  k = 0;.  w.u.pGr
10170 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
10180 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
10190 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
101a0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
101b0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
101c0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
101d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
101e0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
101f0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
10200 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
10210 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
10220 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
10230 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
10240 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
10250 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
10260 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
10270 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
10280 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
10290 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
102a0 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
102b0 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
102c0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
102d0 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
102e0 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
102f0 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
10300 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
10310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10320 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
10330 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
10340 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
10350 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
10360 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
10370 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
10380 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
10390 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
103a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
103b0 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
103c0 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
103d0 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
103e0 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
103f0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
10400 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
10410 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
10420 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
10430 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
10440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10450 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
10460 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
10470 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10480 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10490 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
104a0 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
104b0 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
104c0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
104d0 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
104e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
104f0 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
10500 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
10510 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
10520 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rt2;.#endif.  sq
10530 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10540 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10550 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
10560 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10570 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
10580 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
10590 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
105a0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
105b0 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
105c0 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
105d0 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
105e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
105f0 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
10600 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
10610 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
10620 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
10630 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
10640 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
10650 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
10660 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
10670 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
10680 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
10690 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
106a0 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
106b0 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
106c0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  nt rc = 0;.  if(
106d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
106e0 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68  ;  /* Can only h
106f0 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  appen following 
10700 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20  on OOM */..  /* 
10710 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
10720 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
10730 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
10740 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
10750 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
10760 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
10770 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
10780 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
10790 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
107a0 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
107b0 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
107c0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
107d0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
107e0 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
107f0 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
10800 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
10810 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
10820 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
10830 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
10840 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
10850 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
10860 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
10870 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
10880 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10890 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
108a0 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
108b0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
108c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
108d0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
108e0 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
108f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
10900 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
10910 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
10920 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
10930 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
10940 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
10950 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
10960 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10980 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
10990 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
109a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
109b0 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
109c0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
109d0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
109e0 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
109f0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
10a00 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
10a10 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
10a20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10a30 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
10a40 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
10a50 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
10a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10a70 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
10a80 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
10a90 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
10aa0 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
10ab0 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
10ac0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
10ad0 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
10ae0 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
10af0 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
10b00 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
10b10 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
10b20 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
10b30 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
10b40 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
10b50 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
10b60 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
10b70 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
10b80 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
10b90 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
10ba0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
10bb0 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
10bc0 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
10bd0 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
10be0 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
10bf0 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
10c00 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
10c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10c20 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
10c30 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
10c40 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
10c50 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
10c60 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
10c70 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
10c80 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
10c90 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
10ca0 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
10cb0 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
10cc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
10cd0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
10ce0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
10cf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
10d00 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
10d10 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
10d20 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
10d30 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
10d40 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
10d50 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
10d60 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
10d70 20 20 20 20 20 20 20 20 70 2d 3e 70 54 61 62 3d          p->pTab=
10d80 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65  =0 ||  /* Refere
10d90 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66  nce to column of
10da0 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
10db0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sion */.        
10dc0 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
10dd0 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
10de0 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
10df0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
10e00 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
10e10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
10e20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
10e30 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
10e40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
10e50 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
10e60 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
10e70 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
10e80 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
10e90 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
10ea0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
10eb0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
10ec0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10ed0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
10ee0 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
10ef0 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
10f00 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
10f10 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
10f20 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
10f30 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
10f40 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
10f50 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
10f60 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
10f70 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
10f80 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
10f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10fa0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
10fb0 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
10fc0 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
10fd0 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
10fe0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
10ff0 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
11000 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
11010 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
11020 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
11030 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
11040 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
11050 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
11060 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
11070 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
11080 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
11090 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
110a0 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
110b0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
110c0 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
110d0 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
110e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
110f0 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
11100 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
11110 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
11120 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11130 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11140 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
11150 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
11160 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
11170 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
11180 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
11190 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
111a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
111b0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
111c0 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
111d0 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
111e0 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
111f0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
11200 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
11210 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
11220 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
11230 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
11240 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
11250 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
11260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
11270 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
11280 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
11290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
112a0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
112b0 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
112c0 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
112d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
112e0 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
112f0 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
11300 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
11310 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
11320 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11330 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11340 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
11350 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11360 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11370 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
11380 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
11390 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
113a0 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
113b0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
113c0 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
113d0 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
113e0 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
113f0 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
11400 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
11410 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
11420 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11430 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11440 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
11450 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11460 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
11470 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11480 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
11490 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
114a0 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
114b0 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
114c0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
114d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
114e0 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
114f0 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
11500 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
11510 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
11520 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
11530 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
11540 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
11550 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
11560 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
11570 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
11580 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
11590 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75   0;  /* Not a su
115a0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
115b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
115c0 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
115d0 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  )  ) return 0;  
115e0 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75  /* Correlated su
115f0 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e  bq */.  p = pX->
11600 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  x.pSelect;.  if(
11610 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
11620 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
11630 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
11640 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
11650 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
11660 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11670 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
11680 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
11690 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
116a0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
116b0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
116c0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
116d0 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
116e0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
116f0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
11700 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
11710 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
11720 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
11730 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
11740 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
11750 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
11760 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
11770 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
11780 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
11790 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
117a0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
117b0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
117c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
117d0 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
117e0 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  e */.  if( p->pW
117f0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11810 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
11820 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
11830 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
11840 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
11850 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
11860 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
11870 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
11880 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
11890 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
118a0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
118b0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
118c0 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
118d0 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
118e0 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
118f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
11900 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
11910 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11920 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
11930 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
11940 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
11950 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
11960 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11970 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
11980 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
11990 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
119a0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
119b0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
119c0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
119d0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  List!=0 );.  /* 
119e0 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c  All SELECT resul
119f0 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d  ts must be colum
11a00 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ns. */.  for(i=0
11a10 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
11a20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
11a30 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74  r *pRes = pEList
11a40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11a50 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d    if( pRes->op!=
11a60 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
11a70 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74  rn 0;.    assert
11a80 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d  ( pRes->iTable==
11a90 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11aa0 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  or );  /* Not a 
11ab0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
11ac0 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ery */.  }.  ret
11ad0 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn p;.}.#endif 
11ae0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
11af0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
11b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11b10 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
11b20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
11b30 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
11b40 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
11b50 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
11b60 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
11b70 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
11b80 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
11b90 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
11ba0 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
11bb0 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
11bc0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11bd0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
11be0 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
11bf0 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
11c00 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
11c10 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
11c20 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
11c30 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
11c40 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
11c50 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
11c60 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
11c70 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
11c80 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
11c90 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c  int addr1;.  sql
11ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11cb0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11cc0 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
11cd0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
11ce0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11cf0 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56  Rewind, iCur); V
11d00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d20 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
11d30 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61  , iCur, 0, regHa
11d40 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  sNull);.  sqlite
11d50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11d60 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
11d70 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  G);.  VdbeCommen
11d80 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74  t((v, "first_ent
11d90 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72  ry_in(%d)", iCur
11da0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
11db0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11dc0 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  r1);.}.#endif...
11dd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11de0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
11df0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
11e00 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
11e10 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
11e20 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
11e30 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
11e40 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
11e50 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
11e60 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
11e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11e80 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
11e90 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
11ea0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
11eb0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
11ec0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
11ed0 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
11ee0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
11ef0 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
11f00 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
11f10 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
11f20 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11f30 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
11f40 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
11f50 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
11f60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
11f70 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
11f80 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
11f90 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
11fa0 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
11fb0 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
11fc0 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
11fd0 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
11fe0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
11ff0 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
12000 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
12010 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
12020 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
12030 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
12040 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
12050 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
12060 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
12070 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
12080 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
12090 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
120a0 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
120b0 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
120c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
120d0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
120e0 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
120f0 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
12100 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
12110 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
12120 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
12130 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
12140 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12150 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
12160 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
12170 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
12180 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
12190 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
121a0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
121b0 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
121c0 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
121d0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
121e0 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
121f0 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
12200 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12210 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
12220 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
12230 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
12240 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12250 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
12260 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12270 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
12280 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
12290 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
122a0 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
122b0 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
122c0 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
122d0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
122e0 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
122f0 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
12300 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12310 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
12320 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
12330 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12340 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
12350 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
12360 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
12370 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
12380 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
123a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
123b0 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
123c0 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
123d0 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
123e0 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
123f0 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
12400 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
12410 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
12420 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
12430 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
12440 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e  1>, <column2>...
12450 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
12460 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
12470 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12480 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
12490 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
124a0 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
124b0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
124c0 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
124d0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
124e0 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
124f0 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
12500 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
12510 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
12520 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
12530 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
12540 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
12550 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
12560 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
12570 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  , at a minimum, 
12580 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a  one of the bits.
12590 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
125a0 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44  ERSHIP or IN_IND
125b0 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20  EX_LOOP but not 
125c0 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c 61 67  both.  If inFlag
125d0 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
125e0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
125f0 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
12600 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
12610 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 66   be used for a f
12620 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69  ast.** membershi
12630 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
12640 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
12650 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 20  bit is set, the 
12660 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a  IN index will.**
12670 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
12680 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
12690 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
126a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  he IN operator..
126b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
126c0 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
126d0 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
126e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
126f0 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
12700 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
12710 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
12720 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
12730 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
12740 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
12750 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  l table will be 
12760 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73 20 74  created unless t
12770 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
12780 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  mns are guarante
12790 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
127a0 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
127b0 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
127c0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
127d0 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20   or due to.** a 
127e0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
127f0 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  t or index..**.*
12800 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
12810 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
12820 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
12830 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
12840 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
12850 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
12860 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
12870 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
12880 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
12890 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20  ss <columns> is 
128a0 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52  a single INTEGER
128b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
128c0 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e  umn or an .** in
128d0 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  dex can be found
128e0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
128f0 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73  ied <columns> as
12900 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a   its left-most..
12910 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
12920 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
12930 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
12940 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
12950 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
12960 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12970 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
12980 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
12990 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
129a0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
129b0 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
129c0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
129d0 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
129e0 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
129f0 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
12a00 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
12a10 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
12a20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
12a30 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
12a40 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
12a50 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
12a60 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
12a70 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
12a80 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
12a90 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
12aa0 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
12ab0 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
12ac0 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
12ad0 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
12ae0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
12af0 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
12b00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12b10 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
12b20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
12b30 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
12b40 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
12b50 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
12b60 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
12b70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
12b80 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
12b90 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
12ba0 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
12bb0 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
12bc0 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
12bd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
12be0 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
12bf0 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
12c00 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
12c10 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
12c20 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
12c30 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
12c40 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
12c50 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
12c60 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
12c70 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
12c80 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
12c90 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
12ca0 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
12cb0 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
12cc0 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
12cd0 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
12ce0 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
12cf0 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
12d00 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
12d10 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
12d20 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
12d30 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
12d40 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
12d50 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
12d60 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
12d70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
12d80 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20  aiMap parameter 
12d90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
12da0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
12db0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e   array containin
12dc0 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  g.** one element
12dd0 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
12de0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
12df0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12e00 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20  t on the RHS.** 
12e10 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f  of the IN(...) o
12e20 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74  perator. The i't
12e30 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61  h entry of the a
12e40 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
12e50 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66  d with the.** of
12e60 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65  fset of the inde
12e70 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61  x column that ma
12e80 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63  tches the i'th c
12e90 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
12ea0 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e  y the.** SELECT.
12eb0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
12ec0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12ed0 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64  and selected ind
12ee0 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ex are:.**.**   
12ef0 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45  (?,?,?) IN (SELE
12f00 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
12f10 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  t1).**   CREATE 
12f20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
12f30 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74  , c, a);.**.** t
12f40 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70  hen aiMap[] is p
12f50 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32  opulated with {2
12f60 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e  , 0, 1}..*/.#ifn
12f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f80 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
12f90 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
12fa0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12fc0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fd0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20   */.  Expr *pX, 
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
13000 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66  nd side (RHS) of
13010 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13020 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67   */.  u32 inFlag
13030 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13040 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   /* IN_INDEX_LOO
13050 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  P, _MEMBERSHIP, 
13060 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20  and/or _NOOP_OK 
13070 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48  */.  int *prRhsH
13080 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  asNull,         
13090 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
130a0 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e  ing NULL status.
130b0 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20    See notes */. 
130c0 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20   int *aiMap     
130d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
130e0 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65  apping from Inde
130f0 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20  x fields to RHS 
13100 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53  fields */.){.  S
13110 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
13140 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
13150 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
13160 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13180 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
13190 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
131a0 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
131b0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
131c0 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
131d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
131e0 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
131f0 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
13200 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
13210 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13220 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
13230 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
13240 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13250 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
13260 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
13270 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
13280 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
13290 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
132a0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
132b0 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
132c0 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
132d0 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
132e0 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
132f0 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
13300 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
13310 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
13320 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13330 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
13340 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
13350 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
13360 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
13370 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
13380 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
13390 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
133a0 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
133b0 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
133c0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
133d0 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
133e0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
133f0 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
13400 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
13410 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
13420 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
13430 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
13440 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
13450 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
13460 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
13470 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13480 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
13490 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
134a0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
134b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
134c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
134d0 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
134e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
134f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13500 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
13510 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
13520 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
13530 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13540 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13550 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
13560 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
13570 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
13580 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
13590 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
135a0 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
135b0 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
135c0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
135d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
135e0 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
135f0 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
13600 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
13610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
13620 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13640 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13650 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
13660 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
13690 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
136a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
136d0 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
136e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
136f0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
13700 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
13710 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
13720 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13730 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
13740 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
13750 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
13760 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
13770 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13780 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
13790 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
137a0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
137b0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
137c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
137d0 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
137e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
137f0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
13800 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
13810 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
13820 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
13830 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
13840 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
13850 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
13860 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
13870 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13880 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13890 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
138a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
138b0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
138c0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
138d0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
138e0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
138f0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
13900 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
13910 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
13920 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
13930 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
13940 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
13950 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
13960 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
13970 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
13980 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
13990 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
139a0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
139b0 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
139c0 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
139d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
139e0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
139f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
13a00 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
13a10 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
13a20 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
13a30 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
13a40 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
13a50 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
13a60 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
13a70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13a80 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
13a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
13aa0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
13ad0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  iable */.      i
13ae0 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
13af0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   1;.      int i;
13b00 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
13b10 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
13b20 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
13b30 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
13b40 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63  each .      ** c
13b50 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
13b60 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
13b70 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f  inity of each co
13b80 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20  lumn in table.  
13b90 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48      ** on the RH
13ba0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
13bb0 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74  ator.  If it not
13bc0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
13bd0 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ible to.      **
13be0 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f   use any index o
13bf0 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e  f the RHS table.
13c00 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
13c10 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61  =0; i<nExpr && a
13c20 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29  ffinity_ok; i++)
13c30 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
13c40 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65  pLhs = sqlite3Ve
13c50 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
13c60 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  (pX->pLeft, i);.
13c70 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
13c80 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
13c90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
13ca0 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
13cb0 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62  aff = sqlite3Tab
13cc0 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  leColumnAffinity
13cd0 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20  (pTab,iCol); /* 
13ce0 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  RHS table */.   
13cf0 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66       char cmpaff
13d00 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
13d10 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20  eAffinity(pLhs, 
13d20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
13d30 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
13d40 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
13d50 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  OB );.        te
13d60 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
13d70 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
13d80 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  );.        switc
13d90 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20  h( cmpaff ){.   
13da0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
13db0 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
13dc0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13dd0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
13de0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
13df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
13e00 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13e10 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74  inity() only ret
13e20 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65  urns TEXT if one
13e30 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
13e40 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65           ** othe
13e50 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74  r has no affinit
13e60 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  y and the other 
13e70 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48  side is TEXT.  H
13e80 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ence,.          
13e90 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61    ** the only wa
13ea0 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20  y for cmpaff to 
13eb0 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69  be TEXT is for i
13ec0 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  dxaff to be TEXT
13ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
13ee0 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d  and for the term
13ef0 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
13f00 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f  he IN to have no
13f10 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
13f20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13f30 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45  ( idxaff==SQLITE
13f40 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
13f50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13f60 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
13f70 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
13f80 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
13f90 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
13fa0 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
13fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13fc0 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69  ..      if( affi
13fd0 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20  nity_ok ){.     
13fe0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
13ff0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
14000 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72  ex that will wor
14010 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  k for this IN op
14020 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
14030 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14040 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
14050 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d   eType==0; pIdx=
14060 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
14070 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
14080 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a  colUsed;      /*
14090 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   Columns of the 
140a0 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20  index used */.  
140b0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
140c0 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  mCol;         /*
140d0 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75   Mask for the cu
140e0 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  rrent column */.
140f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
14100 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70  dx->nColumn<nExp
14110 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14120 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
14130 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d  um nColumn is BM
14140 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20  S-2, not BMS-1, 
14150 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
14160 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20  ompute.         
14170 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70   ** BITMASK(nExp
14180 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66  r) without overf
14190 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  lowing */.      
141a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
141b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53  dx->nColumn==BMS
141c0 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -2 );.          
141d0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
141e0 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29  nColumn==BMS-1 )
141f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14200 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42  pIdx->nColumn>=B
14210 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  MS-1 ) continue;
14220 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
14230 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20  ustBeUnique ){. 
14240 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14250 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78  Idx->nKeyCol>nEx
14260 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pr.             
14270 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ||(pIdx->nColumn
14280 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69  >nExpr && !IsUni
14290 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a  queIndex(pIdx)).
142a0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
142c0 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20  tinue;  /* This 
142d0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69  index is not uni
142e0 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20  que over the IN 
142f0 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  RHS columns */. 
14300 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14310 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
14320 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20        colUsed = 
14330 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  0;   /* Columns 
14340 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f  of index used so
14350 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
14360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
14370 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14380 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
14390 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
143a0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
143b0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
143c0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
143d0 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  hs = pEList->a[i
143e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
143f0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
14400 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
14410 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
14420 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
14430 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rhs);.          
14440 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20    int j;.  .    
14450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14460 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d  pReq!=0 || pRhs-
14470 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
14480 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ID || pParse->nE
14490 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
144a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78    for(j=0; j<nEx
144b0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
144c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
144d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70  ->aiColumn[j]!=p
144e0 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  Rhs->iColumn ) c
144f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14510 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29  Idx->azColl[j] )
14520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14530 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73  if( pReq!=0 && s
14540 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
14550 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
14560 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
14570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14580 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
14590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
145a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
145b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
145c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
145d0 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b  ==nExpr ) break;
145e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f  .            mCo
145f0 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a  l = MASKBIT(j);.
14600 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14610 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29  mCol & colUsed )
14620 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20   break; /* Each 
14630 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79  column used only
14640 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20   once */.       
14650 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
14660 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mCol;.          
14670 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
14680 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
14690 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
146a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
146b0 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64  nExpr || colUsed
146c0 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  !=(MASKBIT(nExpr
146d0 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  )-1) );.        
146e0 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28    if( colUsed==(
146f0 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
14700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14710 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
14720 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
14730 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78   means the index
14740 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20   pIdx is usable 
14750 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
14760 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
14770 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14780 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
14790 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66 6e 64  verage(v);.#ifnd
147a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
147b0 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20 20 20  XPLAIN.         
147c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
147d0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
147e0 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20  in, 0, 0, 0,.   
147f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14800 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 55  e3MPrintf(db, "U
14810 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
14820 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
14830 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  Idx->zName),.   
14840 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 44 59             P4_DY
14850 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20  NAMIC);.#endif. 
14860 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14870 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14880 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
14890 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
148a0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
148b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
148c0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
148d0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
148e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
148f0 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
14900 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
14920 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
14930 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
14940 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
14950 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
14960 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
14970 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
14980 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20  Order[0];.  .   
14990 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52           if( prR
149a0 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66  hsHasNull ){.#if
149b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
149c0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
149d0 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  SK.             
149e0 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c   i64 mask = (1<<
149f0 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20  nExpr)-1;.      
14a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14a10 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
14a20 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
14a30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14a40 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20      iTab, 0, 0, 
14a50 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49  (u8*)&mask, P4_I
14a60 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52              *prR
14a80 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50  hsHasNull = ++pP
14a90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
14aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
14ab0 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
14ac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14ad0 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
14ae0 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48  v, iTab, *prRhsH
14af0 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  asNull);.       
14b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14b30 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
14b40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14b50 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
14b60 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73  oop over indexes
14b70 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45   */.      } /* E
14b80 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f  nd if( affinity_
14b90 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a  ok ) */.    } /*
14ba0 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72   End if not an r
14bb0 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  owid index */.  
14bc0 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74  } /* End attempt
14bd0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69   to optimize usi
14be0 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a  ng an index */..
14bf0 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78    /* If no preex
14c00 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  isting index is 
14c10 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
14c20 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a  e IN clause.  **
14c30 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   and IN_INDEX_NO
14c40 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64  OP is an allowed
14c50 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20   reply.  ** and 
14c60 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
14c70 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
14c80 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71  list, not a subq
14c90 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  uery.  ** and th
14ca0 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e RHS is not con
14cb0 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f  stant or has two
14cc0 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c   or fewer terms,
14cd0 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
14ce0 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74   not worth creat
14cf0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
14d00 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61   table to evalua
14d10 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f  te.  ** the IN o
14d20 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72  perator so retur
14d30 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
14d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
14d50 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c  e==0.   && (inFl
14d60 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e  ags & IN_INDEX_N
14d70 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45  OOP_OK).   && !E
14d80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14d90 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
14da0 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
14db0 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
14dc0 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69  pX) || pX->x.pLi
14dd0 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20  st->nExpr<=2).  
14de0 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  ){.    eType = I
14df0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20  N_INDEX_NOOP;.  
14e00 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
14e10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
14e20 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78  d not find an ex
14e30 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
14e40 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
14e50 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
14e60 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
14e70 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
14e80 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
14e90 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
14ea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
14eb0 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
14ec0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
14ed0 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
14ee0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
14ef0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
14f00 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
14f10 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  f( inFlags & IN_
14f20 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20  INDEX_LOOP ){.  
14f30 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
14f40 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  ryLoop = 0;.    
14f50 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
14f60 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
14f70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14f80 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
14f90 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70   ){.        eTyp
14fa0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
14fb0 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
14fc0 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48  }else if( prRhsH
14fd0 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
14fe0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
14ff0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
15000 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15010 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15020 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
15030 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
15040 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
15050 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
15060 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
15070 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
15080 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
15090 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
150a0 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20  e = iTab;.  }.. 
150b0 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
150c0 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
150d0 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
150e0 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
150f0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
15100 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
15110 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
15120 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
15130 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15140 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
15150 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
15160 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
15170 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
15180 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
15190 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
151a0 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20  pExpr is an (?, 
151b0 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78  ?...) IN(...) ex
151c0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a  pression. This .
151d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
151e0 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
151f0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
15200 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
15210 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66  ning .** the aff
15220 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73  inities to be us
15230 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ed for each colu
15240 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  mn of the compar
15250 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ison..**.** It i
15260 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15270 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
15280 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
15290 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  t the returned.*
152a0 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e  * string is even
152b0 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
152c0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
152d0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
152e0 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69  ar *exprINAffini
152f0 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
15300 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
15310 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
15320 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
15330 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
15340 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
15350 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63  (pLeft);.  Selec
15360 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45  t *pSelect = (pE
15370 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
15380 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78  xIsSelect) ? pEx
15390 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pr->x.pSelect : 
153a0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
153b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
153c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
153d0 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
153e0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72  DbMallocRaw(pPar
153f0 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
15400 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
15410 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
15420 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
15430 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
15440 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
15450 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
15460 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
15470 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
15480 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
15490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
154a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
154b0 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
154c0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
154d0 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
154e0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
154f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15500 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
15510 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
15520 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
15530 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
15540 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
15550 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
15560 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15570 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
15580 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
15590 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
155a0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
155b0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
155c0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
155d0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
155e0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
155f0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
15600 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
15610 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
15620 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
15630 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
15640 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
15650 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
15660 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
15670 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
15680 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
15690 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
156a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
156b0 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
156c0 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
156d0 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  f../*.** Express
156e0 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
156f0 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20 62  ector that has b
15700 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f  een used in a co
15710 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69  ntext where.** i
15720 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  t is not permitt
15730 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73 20  ed. If pExpr is 
15740 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63  a sub-select vec
15750 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  tor, this routin
15760 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20  e .** loads the 
15770 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74  Parse object wit
15780 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74  h a message of t
15790 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
157a0 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
157b0 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d  urns N columns -
157c0 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a   expected 1".**.
157d0 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  ** Or, if it is 
157e0 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72  a regular scalar
157f0 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20   vector:.**.**  
15800 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
15810 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  sed".*/   .void 
15820 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
15830 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61  orMsg(Parse *pPa
15840 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15850 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15860 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15870 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
15880 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
15890 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
158a0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
158b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e  Parse, pExpr->x.
158c0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
158d0 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65  >nExpr, 1);.  }e
158e0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
158f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15900 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
15910 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
15920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
15930 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
15940 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
15950 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71  s used as a subq
15960 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
15970 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49   EXISTS,.** or I
15980 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
15990 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
159a0 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
159b0 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
159c0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
159d0 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
159e0 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
159f0 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
15a00 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
15a10 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
15a20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
15a30 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
15a40 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
15a50 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
15a60 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
15a70 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
15a80 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
15a90 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
15aa0 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
15ab0 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
15ac0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
15ad0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
15ae0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
15af0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  ubquery..**.** I
15b00 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f  f parameter isRo
15b10 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  wid is non-zero,
15b20 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
15b30 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e   pExpr is guaran
15b40 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66  teed.** to be of
15b50 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69   the form "<rowi
15b60 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22  d> IN (?, ?, ?)"
15b70 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20  , where <rowid> 
15b80 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a  is a reference.*
15b90 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65  * to some intege
15ba0 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  r key column of 
15bb0 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20  a table B-Tree. 
15bc0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73  In this case, us
15bd0 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42  e an.** intkey B
15be0 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74  -Tree to store t
15bf0 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e  he set of IN(...
15c00 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64  ) values instead
15c10 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
15c20 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62   (slower) variab
15c30 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42  le length keys B
15c40 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -Tree..**.** If 
15c50 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
15c60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d  non-zero, that m
15c70 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70  eans that the op
15c80 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e  eration is an IN
15c90 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43  .** (not a SELEC
15ca0 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64  T or EXISTS) and
15cb0 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69   that the RHS mi
15cc0 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ght contains NUL
15cd0 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20  Ls..** All this 
15ce0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20  routine does is 
15cf0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  initialize the r
15d00 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79  egister given by
15d10 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a   rMayHaveNull.**
15d20 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69   to NULL.  Calli
15d30 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ng routines will
15d40 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68   take care of ch
15d50 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69  anging this regi
15d60 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f  ster.** value to
15d70 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65   non-NULL if the
15d80 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65   RHS is NULL-fre
15d90 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53  e..**.** For a S
15da0 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
15db0 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e  operator, return
15dc0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
15dd0 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  at holds the.** 
15de0 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d  result.  For a m
15df0 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45  ulti-column SELE
15e00 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  CT, the result i
15e10 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f  s stored in a co
15e20 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61  ntiguous.** arra
15e30 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
15e40 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  nd the return va
15e50 6c 75 65 20 69 73 20 74 68 65 20 72 65 67 69 73  lue is the regis
15e60 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  ter of the left-
15e70 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63  most.** result c
15e80 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30  olumn.  Return 0
15e90 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   for IN operator
15ea0 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
15eb0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e   occurs..*/.#ifn
15ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ed0 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
15ee0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15ef0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
15f00 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
15f10 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15f20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
15f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15f40 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
15f50 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
15f60 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73  or */.  int rHas
15f70 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20  NullFlag,       
15f80 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
15f90 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
15fa0 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
15fb0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
15fc0 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
15fd0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
15fe0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
15ff0 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
16000 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61  .  int jmpIfDyna
16010 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  mic = -1;       
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16030 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
16040 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
16050 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16080 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
16090 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
160a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
160b0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
160c0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
160d0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
160e0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
160f0 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
16100 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  e evaluation of 
16110 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f 53 45  the IN/EXISTS/SE
16120 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72 65 70  LECT must be rep
16130 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65  eated every time
16140 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f   it.  ** is enco
16150 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f  untered if any o
16160 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
16170 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
16180 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
16190 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
161a0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
161b0 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
161c0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
161d0 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
161e0 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
161f0 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
16200 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
16210 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
16220 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
16230 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
16240 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
16250 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
16260 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
16270 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
16280 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
16290 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
162a0 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
162b0 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
162c0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
162d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
162e0 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
162f0 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
16300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16310 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
16320 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16330 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
16340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16350 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65  AIN.  if( pParse
16360 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
16370 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
16380 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16390 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45  pParse->db, "EXE
163a0 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45  CUTE %s%s SUBQUE
163b0 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
163c0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f  jmpIfDynamic>=0?
163d0 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
163e0 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ,.        pExpr-
163f0 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54  >op==TK_IN?"LIST
16400 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20  ":"SCALAR",.    
16410 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78      pParse->iNex
16420 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b  tSelectId.    );
16430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16440 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
16450 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
16460 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
16470 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
16480 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
16490 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
164a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
164b0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
164c0 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
164d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
164e0 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
164f0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
16500 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
16510 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16520 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
16530 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
16540 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
16550 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16560 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
16570 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
16580 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  /.      int nVal
16590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
165a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
165b0 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
165c0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c       .      nVal
165d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
165e0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
165f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16600 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d  isRowid || nVal=
16610 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
16620 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
16630 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
16640 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
16650 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
16660 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
16670 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
16680 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
16690 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
166a0 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
166b0 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78  illed with index
166c0 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
166d0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  ng the results f
166e0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  rom the .      *
166f0 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  * SELECT or the 
16700 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
16710 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
16720 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
16730 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
16740 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
16750 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
16760 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16770 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16780 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16790 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
167a0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
167b0 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
167c0 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
167d0 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
167e0 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
167f0 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
16800 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16810 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16820 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
16830 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
16840 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
16850 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
16860 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
16870 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
16880 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
16890 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
168a0 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
168b0 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
168c0 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
168d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
168e0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
168f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16900 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
16910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16920 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
16930 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
16940 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f  r->iTable, (isRo
16950 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20  wid?0:nVal));.  
16960 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69      pKeyInfo = i
16970 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c  sRowid ? 0 : sql
16980 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
16990 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
169a0 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  l, 1);..      if
169b0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
169c0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
169d0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
169e0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
169f0 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
16a00 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
16a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
16a20 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
16a30 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
16a40 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
16a50 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
16a60 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
16a70 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
16a80 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
16a90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16aa0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
16ab0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
16ac0 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ct;.        Expr
16ad0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
16ae0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
16af0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16b00 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
16b10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c       /* If the L
16b20 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68  HS and RHS of th
16b30 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f  e IN operator do
16b40 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74   not match, that
16b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
16b60 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
16b70 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66   caught long bef
16b80 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69  ore we reach thi
16b90 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
16ba0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
16bb0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56  EList->nExpr==nV
16bc0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16bd0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
16be0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16bf0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  i;.          sql
16c00 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
16c10 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
16c20 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
16c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73  );.          des
16c40 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70  t.zAffSdst = exp
16c50 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
16c60 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
16c70 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
16c80 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
16c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16ca0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
16cb0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
16cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
16cd0 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
16ce0 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
16cf0 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
16d00 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
16d10 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
16d20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16d30 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
16d40 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
16d50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16d60 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
16d70 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
16d80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16d90 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
16da0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
16db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16dc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16de0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
16df0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
16e00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16e10 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
16e20 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
16e30 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
16e40 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
16e50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16e60 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
16e70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16e80 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
16e90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
16ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
16eb0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
16ec0 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
16ed0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
16ee0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
16ef0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
16f00 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
16f10 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
16f20 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
16f30 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
16f40 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
16f50 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
16f60 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20  ollSeq(.        
16f70 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
16f80 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p, pEList->a[i].
16f90 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  pExpr.          
16fa0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
16fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16fc0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
16fd0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
16fe0 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
16ff0 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
17000 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
17010 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
17020 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
17030 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
17040 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
17050 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
17060 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
17070 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
17080 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17090 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
170a0 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
170b0 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
170c0 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
170d0 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
170e0 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
170f0 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
17100 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
17110 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
17120 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
17130 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
17140 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
17150 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
17160 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
17170 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
17180 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
17190 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
171a0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
171b0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
171c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
171d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
171e0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
171f0 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  ;..        affin
17200 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17210 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
17230 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
17240 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
17250 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
17260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17270 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
17280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
17290 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
172a0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
172b0 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
172c0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
172d0 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
172e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
172f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17300 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
17310 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17320 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17330 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
17340 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
17350 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
17360 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17370 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
17380 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17390 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
173a0 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
173b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
173c0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  4(v, OP_Blob, 0,
173d0 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53   r2, 0, "", P4_S
173e0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
173f0 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17400 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17410 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17420 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
17430 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
17440 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
17450 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
17460 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
17470 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
17480 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
17490 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
174a0 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
174b0 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
174c0 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
174d0 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
174e0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
174f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
17500 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
17510 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
17520 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
17530 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
17540 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
17550 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
17560 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
17570 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
17580 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
17590 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
175a0 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
175b0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
175c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
175d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
175e0 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44  ToNoop(v, jmpIfD
175f0 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20  ynamic);.       
17600 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
17610 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
17620 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
17630 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
17640 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
17650 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
17660 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
17670 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
17680 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
17690 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
176a0 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
176b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
176c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
176d0 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
176e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
176f0 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
17700 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
17710 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
17720 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17730 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
17740 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
17750 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
17760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17780 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
17790 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
177c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
177d0 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
177e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
177f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17810 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
17820 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
17830 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
17840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17860 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17870 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
17880 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
17890 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
178a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
178b0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
178c0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
178d0 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
178e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17900 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
17910 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
17920 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
17930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17950 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17960 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17970 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
17980 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17990 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
179a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
179b0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
179c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
179d0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
179e0 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
179f0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
17a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17a20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
17a30 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
17a40 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
17a50 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  lt: {.      /* C
17a60 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43  ase 3:    (SELEC
17a70 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17a80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a        **     or:
17a90 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43      EXISTS(SELEC
17aa0 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17ab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17ac0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20  * For a SELECT, 
17ad0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
17ae0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20   put the values 
17af0 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
17b00 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
17b10 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61  first row into a
17b20 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
17b30 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ters and return 
17b40 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20  the index of.   
17b50 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17b60 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20  register..      
17b70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
17b80 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
17b90 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67  , write an integ
17ba0 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
17bb0 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a  ) or 1 (exists).
17bc0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20        ** into a 
17bd0 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74  register and ret
17be0 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65  urn that registe
17bf0 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  r number..      
17c00 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62  **.      ** In b
17c10 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
17c20 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
17c30 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
17c40 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a  .  Any .      **
17c50 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d   preexisting lim
17c60 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20  it is discarded 
17c70 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
17c80 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20  new LIMIT 1..   
17c90 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
17ca0 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
17cd0 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
17ce0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
17cf0 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d10 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
17d20 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
17d30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   */.      int nR
17d40 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
17d70 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20  allocate */.    
17d80 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
17db0 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
17dc0 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
17dd0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
17de0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
17df0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
17e00 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17e10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17e20 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17e30 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
17e40 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
17e50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17e70 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
17e80 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  ect) );..      p
17e90 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
17ea0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52  Select;.      nR
17eb0 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  eg = pExpr->op==
17ec0 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c  TK_SELECT ? pSel
17ed0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
17ee0 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 1;.      sqlit
17ef0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
17f00 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73  (&dest, 0, pPars
17f10 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20  e->nMem+1);.    
17f20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
17f30 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66  = nReg;.      if
17f40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17f50 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
17f60 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
17f70 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
17f80 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73  dest.iSdst = des
17f90 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
17fa0 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20     dest.nSdst = 
17fb0 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  nReg;.        sq
17fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17fd0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
17fe0 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73  est.iSDParm, des
17ff0 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31  t.iSDParm+nReg-1
18000 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
18010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
18020 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
18030 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
18040 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
18050 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
18060 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
18070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18080 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
18090 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
180a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
180b0 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
180c0 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
180d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d      }.      pLim
180e0 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
180f0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
18100 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71  , TK_INTEGER,&sq
18110 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
18120 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
18130 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSel->pLimit ){
18140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18150 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
18160 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
18170 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  mit->pLeft);.   
18180 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
18190 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69  t->pLeft = pLimi
181a0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
181b0 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c          pSel->pL
181c0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
181d0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
181e0 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29  IMIT, pLimit, 0)
181f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18200 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
18210 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
18220 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
18230 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
18240 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18250 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18260 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
18270 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
18280 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
18290 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
182a0 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
182b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
182c0 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
182d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
182e0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
182f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
18300 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
18310 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
18320 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
18330 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18340 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
18350 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
18360 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18370 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
18380 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
18390 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
183a0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
183b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
183c0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
183d0 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
183e0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
183f0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
18400 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
18410 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
18420 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
18430 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
18440 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
18450 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
18460 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
18470 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
18480 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
18490 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
184a0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
184b0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
184c0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
184d0 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
184e0 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
184f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18500 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
18510 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
18520 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
18530 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
18540 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
18550 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18560 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
18570 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
18580 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
18590 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
185a0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
185b0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
185c0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
185d0 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
185e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
185f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18600 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
18610 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
18620 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
18630 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
18640 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
18650 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
18660 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
18670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18680 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
18690 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
186a0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
186b0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
186c0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
186d0 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
186e0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
186f0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
18700 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
18710 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
18720 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
18730 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
18740 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
18750 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
18760 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
18770 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
18780 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
18790 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
187a0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
187b0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
187c0 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
187d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
187e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
187f0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
18800 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
18810 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
18820 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
18830 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
18840 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
18850 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
18860 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
18870 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
18880 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
18890 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
188a0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
188b0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
188c0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
188d0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
188e0 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
188f0 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
18900 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
18910 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
18920 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
18930 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18940 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
18950 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
18960 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
18970 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
18980 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
18990 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
189a0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
189b0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
189c0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
189d0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
189e0 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
189f0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
18a00 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
18a10 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
18a20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
18a30 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
18a40 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
18a50 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
18a60 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
18a70 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
18a80 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
18a90 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
18aa0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
18ab0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
18ac0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
18ad0 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
18ae0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18af0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
18b00 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
18b10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18b20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
18b30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
18b40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
18b50 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
18b60 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18b70 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
18b80 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
18b90 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
18ba0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
18bb0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18bc0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
18bd0 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
18be0 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
18bf0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
18c00 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
18c10 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
18c20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
18c30 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
18c40 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
18c50 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
18c60 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
18c70 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
18c80 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
18c90 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
18ca0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
18cb0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
18cc0 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
18cd0 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
18ce0 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
18cf0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
18d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
18d10 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
18d20 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
18d30 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
18d40 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
18d50 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
18d60 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
18d70 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
18d80 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
18d90 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
18da0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
18db0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
18dc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
18dd0 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
18de0 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
18df0 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
18e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
18e10 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
18e20 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
18e30 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
18e40 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
18e50 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
18e60 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
18e70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18e80 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
18e90 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
18ea0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
18eb0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
18ec0 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
18ed0 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
18ee0 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
18ef0 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
18f00 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
18f10 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
18f20 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
18f30 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
18f40 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
18f50 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
18f60 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
18f70 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
18f80 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
18f90 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
18fa0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
18fb0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
18fc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
18fd0 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
18fe0 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66  loop */ ..  pLef
18ff0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
19000 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
19010 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
19020 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
19030 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
19040 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
19050 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
19060 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
19070 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
19080 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
19090 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
190a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
190b0 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
190c0 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
190d0 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
190e0 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
190f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
19100 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19110 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
19120 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
19130 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
19140 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
19150 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
19160 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
19170 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
19180 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
19190 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
191a0 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
191b0 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72  ith cursor pExpr
191c0 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63  ->iTable .  ** c
191d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
191e0 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
191f0 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
19200 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
19210 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
19220 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
19230 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
19240 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
19250 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
19260 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
19270 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
19280 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
19290 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
192a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
192b0 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
192c0 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
192d0 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
192e0 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
19310 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
19320 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
19350 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
19360 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
19370 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b  HasNull, aiMap);
19380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
19390 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
193a0 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
193b0 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
193c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
193d0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
193e0 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
193f0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
19400 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
19410 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
19420 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
19430 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
19440 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
19450 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
19460 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
19470 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
19480 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
19490 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
194a0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
194b0 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
194c0 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
194d0 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
194e0 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
194f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
19500 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
19510 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
19520 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
19530 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
19540 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
19550 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
19560 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
19570 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
19580 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
19590 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
195a0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
195b0 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
195c0 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
195d0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
195e0 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
195f0 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
19600 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
19610 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
19620 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
19630 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
19640 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
19650 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
19660 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
19670 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
19680 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
19690 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
196a0 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
196b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
196c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
196d0 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67  rse);.  rLhsOrig
196e0 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
196f0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
19700 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
19710 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
19720 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
19730 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
19740 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
19750 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
19760 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
19770 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
19780 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
19790 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
197a0 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
197b0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
197c0 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
197d0 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
197e0 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
197f0 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
19800 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
19810 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
19820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
19830 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
19840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19850 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
19860 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
19870 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
19880 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
19890 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
198a0 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
198b0 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
198c0 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
198d0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
198e0 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
198f0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
19900 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
19910 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
19920 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
19930 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
19940 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
19950 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
19960 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
19970 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
19980 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19990 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
199a0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
199b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
199c0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
199d0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
199e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
199f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
19a00 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
19a10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19a20 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
19a30 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
19a40 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
19a50 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
19a60 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
19a70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19a80 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
19a90 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
19aa0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
19ab0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
19ac0 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
19ad0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19ae0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
19af0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19b00 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
19b10 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
19b20 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
19b30 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
19b40 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
19b50 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
19b60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19b70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
19b80 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
19b90 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
19ba0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
19bb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
19bc0 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
19bd0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
19be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19bf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
19c00 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
19c10 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
19c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19c30 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
19c40 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
19c50 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
19c60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19c70 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19c80 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
19c90 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19cc0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
19cd0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19ce0 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
19cf0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
19d00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19d10 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
19d20 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
19d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19d40 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
19d50 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
19d60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19d70 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
19d80 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
19d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19da0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
19db0 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
19dc0 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
19df0 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
19e00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
19e30 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
19e40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
19e50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
19e60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19e70 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
19e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19e90 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
19ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19eb0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
19ec0 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
19ed0 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
19ee0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
19f00 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
19f10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19f20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19f30 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
19f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
19f50 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19f60 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
19f70 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
19f80 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19f90 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
19fa0 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
19fb0 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
19fc0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
19fd0 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
19fe0 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
19ff0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
1a000 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1a010 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
1a020 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
1a030 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
1a040 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
1a050 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
1a060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1a070 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1a080 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
1a090 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
1a0a0 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
1a0b0 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
1a0c0 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
1a0d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1a0e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1a0f0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1a100 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
1a110 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1a120 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
1a130 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
1a140 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1a150 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
1a160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1a180 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
1a190 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
1a1a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a1b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a1c0 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
1a1d0 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
1a1e0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
1a1f0 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
1a200 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
1a210 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
1a220 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
1a230 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
1a240 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
1a250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a260 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1a270 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
1a280 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
1a290 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
1a2a0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
1a2b0 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
1a2c0 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
1a2d0 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
1a2e0 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
1a2f0 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
1a300 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
1a310 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1a320 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1a330 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a340 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78  P_SeekRowid, pEx
1a350 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
1a360 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
1a370 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a380 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
1a390 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
1a3a0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
1a3b0 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
1a3c0 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
1a3d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a3e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
1a3f0 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
1a400 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
1a410 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
1a420 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
1a430 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
1a440 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
1a450 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
1a460 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
1a470 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
1a480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1a490 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
1a4a0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
1a4b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1a4e0 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1a4f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1a500 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
1a510 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
1a520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
1a530 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
1a540 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
1a550 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
1a560 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
1a570 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
1a580 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1a590 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
1a5a0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
1a5b0 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ble, 0,.        
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
1a5e0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
1a5f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a600 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e   }..  /* Step 4.
1a610 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
1a620 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
1a630 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20  NULL and we did 
1a640 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e  not find.  ** an
1a650 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65   match on the se
1a660 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e  arch above, then
1a670 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1a680 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a   be FALSE..  */.
1a690 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
1a6a0 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20  l && nVector==1 
1a6b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a6c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1a6d0 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
1a6e0 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
1a6f0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1a700 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1a710 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65  * Step 5.  If we
1a720 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
1a730 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ut the differenc
1a740 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61  e between NULL a
1a750 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74  nd.  ** FALSE, t
1a760 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1a770 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69  false. .  */.  i
1a780 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
1a790 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c  destIfNull ) sql
1a7a0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a7b0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
1a7c0 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70   /* Step 6: Loop
1a7d0 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66   through rows of
1a7e0 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61   the RHS.  Compa
1a7f0 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74  re each row to t
1a800 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20  he LHS..  ** If 
1a810 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  any comparison i
1a820 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
1a830 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
1a840 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f    If all.  ** co
1a850 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41  mparisons are FA
1a860 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e  LSE then the fin
1a870 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c  al result is FAL
1a880 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  SE..  **.  ** Fo
1a890 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20  r a scalar LHS, 
1a8a0 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
1a8b0 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74   to check just t
1a8c0 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a  he first row.  *
1a8d0 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  * of the RHS..  
1a8e0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65  */.  if( destSte
1a8f0 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p6 ) sqlite3Vdbe
1a900 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a910 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64  destStep6);.  ad
1a920 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
1a930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a940 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
1a950 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
1a960 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
1a970 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
1a980 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
1a990 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
1a9a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1a9b0 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
1a9c0 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
1a9d0 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
1a9e0 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
1a9f0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
1aa00 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
1aa10 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
1aa20 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1aa30 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
1aa40 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
1aa50 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
1aa60 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1aa70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1aa80 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
1aa90 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
1aaa0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
1aab0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1aac0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1aad0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
1aae0 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
1aaf0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1ab00 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1ab10 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
1ab20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ab30 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
1ab40 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72  pr->iTable, i, r
1ab50 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
1ab60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ab70 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  Ne, rLhs+i, dest
1ab80 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20  NotNull, r3,.   
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1abb0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1abc0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1abd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1abe0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1abf0 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20  rse, r3);.  }.  
1ac00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac10 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1ac20 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1ac30 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
1ac40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ac50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1ac60 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  destNotNull);.  
1ac70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ac80 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
1ac90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
1aca0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
1acb0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1acc0 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
1acd0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1ace0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
1acf0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
1ad00 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
1ad10 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
1ad20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ad30 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1ad40 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
1ad50 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
1ad60 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
1ad70 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
1ad80 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1ad90 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
1ada0 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
1adb0 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
1adc0 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
1add0 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
1ade0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1adf0 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
1ae00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ae10 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
1ae20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1ae30 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
1ae40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1ae50 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
1ae60 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1ae70 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
1ae80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1ae90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
1aea0 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
1aeb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1aec0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
1aed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1aee0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
1aef0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1af00 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1af10 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
1af20 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
1af30 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
1af40 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1af50 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1af60 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
1af70 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
1af80 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
1af90 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
1afa0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
1afb0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
1afc0 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
1afd0 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
1afe0 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
1aff0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
1b000 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
1b010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1b020 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
1b030 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1b040 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
1b050 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
1b060 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
1b070 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
1b080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
1b090 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
1b0a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1b0b0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1b0c0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
1b0d0 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
1b0e0 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
1b0f0 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
1b100 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
1b110 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
1b120 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
1b130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b140 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
1b150 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
1b160 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
1b170 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
1b180 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
1b190 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1b1a0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1b1b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
1b1c0 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
1b1d0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1b1e0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1b1f0 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
1b200 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
1b210 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
1b220 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
1b230 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
1b240 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1b250 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1b260 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
1b270 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
1b280 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b290 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1b2a0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1b2b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
1b2c0 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1b2d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1b2e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
1b2f0 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
1b300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1b320 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
1b330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1b340 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
1b350 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1b360 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
1b370 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
1b380 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
1b390 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
1b3a0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
1b3b0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d  e);.    if( (c==
1b3c0 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c  3 && !negFlag) |
1b3d0 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67  | (c==2) || (neg
1b3e0 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53  Flag && value==S
1b3f0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b  MALLEST_INT64)){
1b400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1b410 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1b420 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
1b430 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b440 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
1b450 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
1b460 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
1b470 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
1b480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
1b490 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
1b4a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
1b4b0 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
1b4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1b4d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b4e0 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
1b4f0 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22  l too big: %s%s"
1b500 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22  , negFlag?"-":""
1b510 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
1b520 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1b530 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1b540 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
1b550 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
1b560 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1b570 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
1b580 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
1b590 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =3 ? SMALLEST_IN
1b5a0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
1b5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b5c0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1b5d0 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
1b5e0 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1b5f0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
1b600 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1b610 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63  Erase column-cac
1b620 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20  he entry number 
1b630 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  i.*/.static void
1b640 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
1b650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b660 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50  int i){.  if( pP
1b670 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b680 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  i].tempReg ){.  
1b690 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1b6a0 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
1b6b0 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
1b6c0 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
1b6d0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1b6e0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1b6f0 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
1b700 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20  ache[i].iReg;.  
1b710 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
1b720 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  ->nColCache--;. 
1b730 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e   if( i<pParse->n
1b740 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1b750 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b760 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
1b770 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1b780 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d  >nColCache];.  }
1b790 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
1b7a0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1b7b0 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
1b7c0 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
1b7d0 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
1b7e0 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
1b7f0 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
1b800 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
1b810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b820 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
1b830 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1b840 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
1b850 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1b860 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
1b870 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
1b880 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1b890 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  e *p;..  /* Unle
1b8a0 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ss an error has 
1b8b0 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74  occurred, regist
1b8c0 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
1b8d0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1b8e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  */.  assert( iRe
1b8f0 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  g>0 || pParse->n
1b900 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
1b910 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  );.  assert( iCo
1b930 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
1b940 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
1b950 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
1b960 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
1b970 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1b980 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
1b990 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1b9a0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
1b9b0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
1b9c0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
1b9d0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
1b9e0 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
1b9f0 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
1ba00 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
1ba10 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1ba20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
1ba30 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1ba40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
1ba50 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
1ba60 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
1ba70 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
1ba80 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
1ba90 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
1baa0 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
1bab0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1bac0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
1bad0 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
1bae0 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
1baf0 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
1bb00 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
1bb10 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
1bb20 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
1bb30 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
1bb40 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
1bb50 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1bb60 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1bb70 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1bb80 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
1bb90 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  ( p->iTable!=iTa
1bba0 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
1bbb0 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
1bbc0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
1bbd0 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61 64   cache is alread
1bbe0 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74  y full, delete t
1bbf0 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c  he least recentl
1bc00 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a  y used entry */.
1bc10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43    if( pParse->nC
1bc20 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f  olCache>=SQLITE_
1bc30 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20  N_COLCACHE ){.  
1bc40 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
1bc50 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72  fffff;.    idxLr
1bc60 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  u = -1;.    for(
1bc70 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1bc80 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1bc90 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1bca0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
1bcb0 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72  if( p->lru<minLr
1bcc0 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78  u ){.        idx
1bcd0 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Lru = i;.       
1bce0 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
1bcf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bd00 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
1bd10 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
1bd20 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  u];.  }else{.   
1bd30 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1bd40 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e  olCache[pParse->
1bd50 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20  nColCache++];.  
1bd60 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
1bd70 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65  new entry to the
1bd80 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
1bd90 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c  e */.  p->iLevel
1bda0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1bdb0 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61  eLevel;.  p->iTa
1bdc0 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d  ble = iTab;.  p-
1bdd0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
1bde0 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65  .  p->iReg = iRe
1bdf0 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  g;.  p->tempReg 
1be00 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20  = 0;.  p->lru = 
1be10 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
1be20 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  t++;.}../*.** In
1be30 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69  dicate that regi
1be40 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52  sters between iR
1be50 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20  eg..iReg+nReg-1 
1be60 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  are being overwr
1be70 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20  itten..** Purge 
1be80 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67  the range of reg
1be90 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20  isters from the 
1bea0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
1beb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1bec0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
1bed0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bee0 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
1bef0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1bf00 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d  while( i<pParse-
1bf10 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1bf20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1bf30 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  he *p = &pParse-
1bf40 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20  >aColCache[i];. 
1bf50 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e     if( p->iReg >
1bf60 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65  = iReg && p->iRe
1bf70 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b  g < iReg+nReg ){
1bf80 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1bf90 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1bfa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bfb0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1bfc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65   }.}../*.** Reme
1bfd0 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  mber the current
1bfe0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f   column cache co
1bff0 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20  ntext.  Any new 
1c000 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a  entries added.**
1c010 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f   added to the co
1c020 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72  lumn cache after
1c030 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72   this call are r
1c040 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a  emoved when the.
1c050 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1c060 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a   pop occurs..*/.
1c070 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c080 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20  CachePush(Parse 
1c090 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
1c0a0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b  se->iCacheLevel+
1c0b0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
1c0c0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c0d0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1c0e0 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1c0f0 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1c100 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64  intf("PUSH to %d
1c110 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1c120 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1c130 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1c140 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63  emove from the c
1c150 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20  olumn cache any 
1c160 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72  entries that wer
1c170 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68  e added since th
1c180 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  e.** the previou
1c190 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  s sqlite3ExprCac
1c1a0 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e  hePush operation
1c1b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c1c0 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68  s, restore.** th
1c1d0 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73  e cache to the s
1c1e0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70  tate it was in p
1c1f0 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65  rior the most re
1c200 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f  cent Push..*/.vo
1c210 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c220 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50  chePop(Parse *pP
1c230 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  arse){.  int i =
1c240 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
1c250 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1c260 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
1c270 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
1c280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c290 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1c2a0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1c2b0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1c2c0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1c2d0 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
1c2e0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1c2f0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1c300 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70  dif.  while( i<p
1c310 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1c320 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1c330 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1c340 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  .iLevel>pParse->
1c350 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
1c360 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1c370 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1c380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c390 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1c3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
1c3b0 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
1c3c0 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
1c3d0 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
1c3e0 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
1c3f0 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
1c400 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
1c410 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
1c420 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
1c430 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
1c440 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
1c450 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
1c460 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
1c470 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
1c480 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1c490 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1c4a0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
1c4b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c4c0 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1c4d0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1c4e0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1c4f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1c500 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1c510 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1c520 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1c530 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
1c540 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
1c550 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
1c560 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1c570 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c  code that will l
1c580 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  oad into registe
1c590 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65  r regOut a value
1c5a0 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72   that is.** appr
1c5b0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
1c5c0 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  iIdxCol-th colum
1c5d0 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
1c5e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c5f0 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
1c600 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  xColumn(.  Parse
1c610 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68   *pParse,  /* Th
1c620 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1c630 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
1c640 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx,    /* The in
1c650 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e  dex whose column
1c660 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64   is to be loaded
1c670 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1c680 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r,    /* Cursor 
1c690 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
1c6a0 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ble row */.  int
1c6b0 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20   iIdxCol,    /* 
1c6c0 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  The column of th
1c6d0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f  e index to be lo
1c6e0 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  aded */.  int re
1c6f0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f  gOut      /* Sto
1c700 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  re the index col
1c710 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69  umn value in thi
1c720 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1c730 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d  .  i16 iTabCol =
1c740 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1c750 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20  iIdxCol];.  if( 
1c760 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52  iTabCol==XN_EXPR
1c770 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c780 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
1c790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1c7a0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45  dx->aColExpr->nE
1c7b0 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20  xpr>iIdxCol );. 
1c7c0 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c7d0 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20  Tab = iTabCur + 
1c7e0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  1;.    sqlite3Ex
1c7f0 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
1c800 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  e, pIdx->aColExp
1c810 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
1c820 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  xpr, regOut);.  
1c830 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
1c840 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ab = 0;.  }else{
1c850 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c860 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c870 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1c880 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1c890 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c8c0 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1c8d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1c8e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1c8f0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1c900 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1c910 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1c920 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c930 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c940 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1c950 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1c960 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1c970 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1c980 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1c990 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1c9a0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1c9b0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1c9c0 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1c9d0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1c9e0 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1c9f0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1ca00 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1ca10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ca20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1ca30 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1ca40 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1ca50 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1ca60 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1ca70 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1ca80 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
1ca90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1caa0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1cab0 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
1cac0 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  regOut);.    ret
1cad0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
1cae0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1caf0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1cb00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb10 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1cb20 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1cb30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb40 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1cb50 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1cb60 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1cb70 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1cb80 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1cb90 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1cba0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1cbb0 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1cbc0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1cbd0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1cbe0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1cbf0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1cc00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cc10 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1cc20 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1cc30 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1cc40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1cc50 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1cc60 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1cc70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1cc80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cc90 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1cca0 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1ccb0 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1ccc0 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1ccd0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1cce0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
1ccf0 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
1cd00 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1cd10 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
1cd20 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
1cd30 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
1cd40 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
1cd50 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
1cd60 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
1cd70 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
1cd80 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
1cd90 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
1cda0 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
1cdb0 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
1cdc0 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
1cdd0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
1cde0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
1cdf0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1ce00 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1ce10 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1ce20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1ce30 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1ce40 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1ce50 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1ce60 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1ce70 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1ce80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1ce90 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1cea0 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1ceb0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1cec0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1ced0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1cee0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1cef0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1cf00 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1cf10 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1cf20 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1cf30 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1cf40 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1cf50 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1cf60 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1cf70 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1cf80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1cf90 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1cfa0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1cfb0 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1cfc0 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1cfd0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1cfe0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1cff0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d000 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1d010 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1d020 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
1d030 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1d040 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1d050 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1d060 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1d070 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
1d080 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
1d090 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
1d0a0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
1d0b0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
1d0c0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
1d0d0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1d0e0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
1d0f0 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
1d100 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
1d110 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
1d120 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1d130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1d140 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1d150 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1d160 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1d170 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1d180 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d190 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
1d1a0 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
1d1b0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1d1c0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
1d1d0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1d1e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1d1f0 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
1d200 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d210 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
1d220 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1d230 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1d240 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1d250 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1d260 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1d270 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1d280 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1d290 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1d2a0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1d2b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1d2c0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1d2d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1d2e0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1d2f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1d300 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d310 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
1d320 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1d330 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1d340 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1d350 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1d360 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
1d370 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
1d380 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
1d390 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
1d3a0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1d3b0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1d3c0 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
1d3d0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
1d3e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
1d3f0 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
1d400 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1d410 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
1d420 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  se){.  int i;..#
1d430 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d440 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1d450 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1d460 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1d470 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1d480 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1d490 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1d4a0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
1d4b0 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
1d4c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1d4d0 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1d4e0 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73  eg.     && pPars
1d4f0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1d500 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1d510 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20  empReg).    ){. 
1d520 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1d530 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1d540 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1d550 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1d560 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1d570 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1d580 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
1d590 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1d5a0 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
1d5b0 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
1d5c0 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
1d5d0 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
1d5e0 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
1d5f0 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
1d600 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1d610 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
1d620 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d630 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
1d640 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
1d650 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1d660 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
1d670 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
1d680 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d690 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1d6a0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1d6b0 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1d6c0 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1d6d0 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
1d6e0 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
1d6f0 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
1d700 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d710 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1d720 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1d730 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1d740 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1d750 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1d760 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1d770 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1d780 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1d790 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1d7a0 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1d7b0 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
1d7c0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1d7d0 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
1d7e0 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
1d7f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1d800 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1d810 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1d820 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1d830 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
1d840 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
1d850 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
1d860 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
1d870 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1d880 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
1d890 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
1d8a0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
1d8b0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
1d8c0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
1d8d0 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
1d8e0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1d8f0 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
1d900 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
1d910 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
1d920 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1d930 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1d940 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
1d950 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1d960 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1d970 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1d980 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1d990 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1d9a0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
1d9b0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
1d9c0 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
1d9d0 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
1d9e0 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
1d9f0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1da00 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1da10 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
1da20 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1da30 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
1da40 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20  onvert a scalar 
1da50 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1da60 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
1da70 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
1da80 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1da90 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1daa0 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67  ensure that iReg
1dab0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1dac0 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
1dad0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65   value for the e
1dae0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1daf0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
1db00 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
1db10 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
1db20 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
1db30 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
1db40 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
1db50 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
1db60 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
1db70 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
1db80 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20  .** Evaluate an 
1db90 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68  expression (eith
1dba0 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
1dbb0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1dbc0 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  on) and store.**
1dbd0 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63   the result in c
1dbe0 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f  ontinguous tempo
1dbf0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20  rary registers. 
1dc00 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1dc10 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  x of.** the firs
1dc20 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  t register used 
1dc30 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1dc40 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ult..**.** If th
1dc50 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1dc60 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  t register is a 
1dc70 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72  temporary scalar
1dc80 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  , then also writ
1dc90 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74  e.** that regist
1dca0 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  er number into *
1dcb0 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20  piFreeable.  If 
1dcc0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1dcd0 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ult register.** 
1dce0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1dcf0 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  ry or if the exp
1dd00 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
1dd10 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61  tor set *piFreea
1dd20 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a  ble.** to 0..*/.
1dd30 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
1dd40 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20  odeVector(Parse 
1dd50 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1dd60 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c  , int *piFreeabl
1dd70 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c  e){.  int iResul
1dd80 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  t;.  int nResult
1dd90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1dda0 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69  ctorSize(p);.  i
1ddb0 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b  f( nResult==1 ){
1ddc0 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73  .    iResult = s
1ddd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1dde0 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69  mp(pParse, p, pi
1ddf0 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  Freeable);.  }el
1de00 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61  se{.    *piFreea
1de10 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1de20 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
1de30 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  T ){.#if SQLITE_
1de40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1de50 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b      iResult = 0;
1de60 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65  .#else.      iRe
1de70 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  sult = sqlite3Co
1de80 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1de90 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65  se, p, 0, 0);.#e
1dea0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1deb0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1dec0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61     iResult = pPa
1ded0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1dee0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1def0 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20  += nResult;.    
1df00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
1df10 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
1df20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1df30 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50  odeFactorable(pP
1df40 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  arse, p->x.pList
1df50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b  ->a[i].pExpr, i+
1df60 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  iResult);.      
1df70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1df80 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a  turn iResult;.}.
1df90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1dfa0 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
1dfb0 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
1dfc0 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
1dfd0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
1dfe0 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
1dff0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1e000 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
1e010 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
1e020 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
1e030 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
1e040 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
1e050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1e060 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
1e070 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
1e080 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
1e090 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
1e0a0 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
1e0b0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
1e0c0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
1e0d0 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
1e0e0 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
1e0f0 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
1e100 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
1e110 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
1e120 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
1e130 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
1e140 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
1e150 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
1e160 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1e170 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
1e180 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1e190 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1e1a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1e1b0 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
1e1c0 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
1e1d0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
1e1e0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1e1f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
1e200 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
1e210 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
1e220 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
1e230 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
1e240 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
1e250 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
1e260 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
1e270 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1e280 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1e290 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1e2a0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1e2b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1e2c0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1e2d0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1e2e0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1e2f0 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20  t r1, r2;       
1e300 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f          /* Vario
1e310 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
1e320 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ers */.  Expr te
1e330 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
1e340 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
1e350 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1e360 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b  */.  int p5 = 0;
1e370 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1e380 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
1e390 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
1e3a0 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
1e3b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e3c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1e3d0 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
1e3e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
1e3f0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1e400 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1e410 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1e420 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1e430 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e440 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1e450 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1e460 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1e470 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1e480 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1e490 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1e4a0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1e4b0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1e4c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1e4d0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1e4e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1e4f0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1e500 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1e510 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1e520 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e530 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1e540 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1e550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e560 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1e570 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1e580 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1e5b0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1e5c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e5d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1e5f0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1e600 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1e610 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1e620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e630 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1e640 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1e650 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1e660 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b     if( iTab<0 ){
1e670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1e680 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20  rse->iSelfTab<0 
1e690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1e6a0 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
1e6b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
1e6c0 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
1e6d0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
1e6e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e6f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1e700 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  - pParse->iSelfT
1e710 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ab;.        }els
1e720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e730 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73  Coding an expres
1e740 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
1e750 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68  t of an index wh
1e760 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ere column names
1e770 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1e780 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1e790 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f   to the table to
1e7a0 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
1e7b0 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20   belongs */.    
1e7c0 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
1e7d0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20  rse->iSelfTab - 
1e7e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1e7f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1e800 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
1e810 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
1e820 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e850 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69  Expr->iColumn, i
1e860 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  Tab, target,.   
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e890 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20  r->op2);.    }. 
1e8a0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
1e8b0 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
1e8c0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1e8d0 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
1e8e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e8f0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e900 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41    case TK_TRUEFA
1e910 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LSE: {.      sql
1e920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e930 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71  , OP_Integer, sq
1e940 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
1e950 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61 72 67  lue(pExpr), targ
1e960 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e970 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e990 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e9a0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1e9b0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1e9c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e9d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e9e0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e9f0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1ea00 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1ea10 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ea20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ea30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1ea40 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1ea50 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1ea60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ea70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ea80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ea90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1eaa0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1eab0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1eac0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1ead0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1eae0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1eaf0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1eb00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1eb10 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1eb20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1eb30 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1eb40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eb50 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1eb60 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1eb70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1eb80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1eb90 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1eba0 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1ebb0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ebc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ebd0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ebe0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1ebf0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1ec00 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1ec10 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1ec20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ec30 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ec40 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1ec50 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1ec60 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1ec70 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1ec80 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1ec90 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1eca0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1ecb0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1ecc0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1ecd0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1ece0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ecf0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1ed00 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1ed10 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1ed20 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1ed30 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1ed40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1ed50 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1ed60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1ed70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ed80 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1ed90 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1eda0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1edb0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1edc0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1edd0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1ede0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1edf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ee00 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1ee10 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1ee20 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1ee30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1ee40 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1ee50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ee60 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1ee70 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1ee80 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1ee90 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1eea0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1eeb0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1eec0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1eed0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1eee0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1eef0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1ef00 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1ef10 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1ef20 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1ef30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ef40 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1ef50 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1ef60 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1ef70 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1ef80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1ef90 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1efa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1efb0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1efc0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1efd0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1efe0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1eff0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1f000 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1f010 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1f020 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1f030 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1f040 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1f050 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f060 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1f070 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1f080 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1f090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f0a0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1f0b0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1f0c0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1f0d0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1f0e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f0f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1f100 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1f130 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1f140 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1f150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1f160 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1f170 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1f180 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1f190 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f1a0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1f1b0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1f1c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1f1d0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1f1e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f1f0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1f200 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1f210 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1f220 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1f230 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1f240 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1f250 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1f260 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1f270 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1f280 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1f290 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1f2a0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1f2b0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1f2c0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1f2d0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1f2e0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1f2f0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1f300 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1f310 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1f320 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1f330 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1f340 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1f350 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1f360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f370 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f380 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f390 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1f3a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1f3b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1f3c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f3d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1f3e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f3f0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f400 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1f410 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f420 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1f430 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1f440 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1f450 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f460 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1f470 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f480 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1f490 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1f4a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f4b0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f4c0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f4d0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f4e0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f4f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f500 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1f510 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f520 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1f530 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1f540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f550 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1f560 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f570 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1f580 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1f590 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f5a0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1f5b0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f5c0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1f5d0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1f5e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f5f0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1f600 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f610 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1f620 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1f630 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f640 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f650 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f660 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f670 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1f680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f690 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1f6a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1f6b0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1f6c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1f6d0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1f6e0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1f6f0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1f700 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1f710 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1f720 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1f730 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1f740 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1f750 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1f760 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1f770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f780 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1f790 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1f7a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1f7b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f7c0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1f7d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1f7e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f7f0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1f800 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1f810 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1f820 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f830 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1f840 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1f850 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1f860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f870 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1f880 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f890 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1f8a0 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1f8b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1f8c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f8d0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1f8e0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1f8f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1f900 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1f910 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1f920 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1f930 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f940 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1f950 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1f960 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1f970 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1f980 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1f990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f9a0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1f9b0 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1f9c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1f9d0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1f9e0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1f9f0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1fa00 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1fa10 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1fa20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1fa30 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1fa40 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1fa50 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1fa60 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1fa70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fa80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fa90 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1faa0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1fab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fac0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fad0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1fae0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1faf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1fb00 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1fb10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1fb20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fb30 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fb40 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fb50 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fb60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fb70 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1fb80 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1fb90 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1fba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1fbb0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1fbc0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1fbd0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1fbe0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1fbf0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1fc00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1fc10 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1fc20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fc30 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1fc40 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1fc50 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1fc60 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1fc70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1fc80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1fc90 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1fca0 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1fcb0 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1fcc0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1fcd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1fce0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1fcf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fd00 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1fd10 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1fd20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1fd30 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1fd40 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1fd50 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1fd60 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1fd70 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fd80 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fd90 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1fda0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1fdb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fdc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fdd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fde0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1fdf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fe00 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1fe10 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1fe20 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1fe30 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fe40 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1fe50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fe60 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1fe70 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1fe80 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1fe90 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1fea0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1feb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fec0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1fed0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1fee0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1fef0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ff00 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1ff10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ff20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ff30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ff40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ff50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ff60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ff70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ff80 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1ff90 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1ffa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ffb0 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
1ffc0 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
1ffd0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
1ffe0 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
1fff0 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61 6c       int bNormal
20000 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f  ;   /* IS TRUE o
20010 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20 20  r IS FALSE */.  
20020 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20030 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20050 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
20060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
20070 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
20080 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
20090 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
200a0 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
200b0 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61 6c  );.      bNormal
200c0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54   = pExpr->op2==T
200d0 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73 74  K_IS;.      test
200e0 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
200f0 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20  bNormal);.      
20100 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
20110 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
20120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20130 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
20140 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52 65  IsTrue, r1, inRe
20150 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54 72  g, !isTrue, isTr
20160 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  ue ^ bNormal);. 
20170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20180 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
20190 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
201a0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
201b0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
201c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
201d0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
201e0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
201f0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
20200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
20210 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
20220 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
20230 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
20240 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
20250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20260 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
20270 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
20280 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20290 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
202a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
202b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
202c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
202d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
202e0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
202f0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
20300 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
20310 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
20320 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
20330 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20340 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
20350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20370 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
20380 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
20390 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
203a0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
203b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
203c0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
203d0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
203e0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
203f0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
20400 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
20410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
20420 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20430 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20440 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
20460 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20470 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
20480 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
20490 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
204a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
204b0 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d     return pInfo-
204c0 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
204d0 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
204e0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
204f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20500 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
20510 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
20520 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
20530 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
20540 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
20550 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
20560 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20570 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
20580 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
20590 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
205a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
205b0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
205c0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
205d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
205e0 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
205f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
20600 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
20610 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
20620 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
20630 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
20640 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
20650 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20670 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20680 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  /.      sqlite3 
20690 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
206a0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
206b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
206c0 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
206d0 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
206e0 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
206f0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
20700 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
20710 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
20720 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
20730 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20740 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 43   */..      if( C
20750 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
20760 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33 45  rse) && sqlite3E
20770 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
20780 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
20790 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75         /* SQL fu
207a0 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65  nctions can be e
207b0 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79  xpensive. So try
207c0 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e   to move constan
207d0 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  t functions.    
207e0 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68      ** out of th
207f0 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76  e inner loop, ev
20800 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
20810 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70   an extra OP_Cop
20820 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  y. */.        re
20830 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20840 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
20850 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
20860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
20870 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20880 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20890 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
208a0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
208b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
208c0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
208d0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
208e0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
208f0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
20900 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
20910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
20920 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
20930 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
20940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
20950 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20960 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
20970 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
20980 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
20990 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
209a0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
209b0 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
209c0 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66  rg, enc, 0);.#if
209d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
209e0 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
209f0 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  NCTION.      if(
20a00 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72   pDef==0 && pPar
20a10 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
20a20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20a30 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
20a40 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c  n(db, "unknown",
20a50 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
20a60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20a70 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
20a80 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61  0 || pDef->xFina
20a90 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
20aa0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20ab0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
20ac0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  own function: %s
20ad0 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  ()", zId);.     
20ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20af0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
20b00 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
20b10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
20b20 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
20b30 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
20b40 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
20b50 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
20b60 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
20b70 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
20b80 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
20b90 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
20ba0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
20bb0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
20bc0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20bd0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20be0 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
20bf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
20c00 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
20c10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20c20 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
20c30 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
20c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20c50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20c60 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20c70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
20c80 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
20c90 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
20ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
20cc0 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
20cd0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
20ce0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
20cf0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
20d00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20d10 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
20d20 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
20d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20d40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
20d50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
20d60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20d70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20d80 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
20d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20da0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
20db0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
20dd0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20de0 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
20df0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
20e00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
20e10 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
20e20 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
20e30 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
20e40 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
20e50 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
20e60 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20e70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
20e80 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
20e90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20ea0 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
20eb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20ec0 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
20ed0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20ee0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
20ef0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20f00 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20f10 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69  et);.      }..#i
20f20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20f30 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41  G.      /* The A
20f40 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69  FFINITY() functi
20f50 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
20f60 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
20f70 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a  scribes.      **
20f80 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
20f90 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ty of the argume
20fa0 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  nt.  This is use
20fb0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66  d for testing of
20fc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51  .      ** the SQ
20fd0 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e  Lite type logic.
20fe0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20ff0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21000 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21010 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20  C_AFFINITY ){.  
21020 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
21030 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62   *azAff[] = { "b
21040 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e  lob", "text", "n
21050 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65  umeric", "intege
21060 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20  r", "real" };.  
21070 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a        char aff;.
21080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21090 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
210a0 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
210b0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46  3ExprAffinity(pF
210c0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
210d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
210e0 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
210f0 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20  v, target, .    
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20            aff ? 
21120 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45  azAff[aff-SQLITE
21130 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f  _AFF_BLOB] : "no
21140 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ne");.        re
21150 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
21160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
21170 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
21180 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
21190 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
211a0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
211b0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
211c0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
211d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
211e0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
211f0 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
21200 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
21210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21220 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
21230 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21240 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
21250 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
21260 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21270 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
21280 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
21290 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
212a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
212b0 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
212c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
212d0 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
212e0 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
212f0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
21300 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
21310 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
21320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21330 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
21340 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
21350 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
21360 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21370 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
21380 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
21390 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
213a0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
213b0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
213c0 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
213d0 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
213e0 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
213f0 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
21400 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
21410 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
21420 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
21430 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
21440 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
21450 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
21460 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
21470 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21480 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
21490 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
214a0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
214b0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
214c0 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
214d0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
214e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
214f0 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
21500 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
21510 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
21520 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21530 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
21540 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
21550 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
21560 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
21570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
21580 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
21590 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
215a0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
215b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
215c0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
215d0 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
215e0 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
215f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21600 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21610 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
21620 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
21630 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
21640 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
21660 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21670 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
21680 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
21690 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
216a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
216b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
216c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
216d0 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
216e0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
216f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21700 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
21710 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
21720 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
21750 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
21760 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
21770 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21780 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
21790 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
217a0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
217b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
217c0 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
217d0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
217e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
217f0 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
21800 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
21810 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
21820 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
21830 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
21840 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
21850 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
21860 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
21870 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
21880 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
21890 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
218a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
218b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
218c0 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
218d0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
218e0 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
218f0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
21900 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
21910 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
21920 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
21930 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
21940 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
21950 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
21960 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
21970 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
21980 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
21990 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
219a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
219b0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
219c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
219d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
219e0 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
219f0 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
21a00 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
21a10 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
21a20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
21a30 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
21a40 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
21a50 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
21a60 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
21a70 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
21a80 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
21a90 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
21aa0 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
21ab0 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
21ac0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
21ad0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21ae0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21af0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21b00 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
21b10 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
21b20 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
21b30 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
21b40 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
21b50 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
21b60 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
21b70 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
21b80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21b90 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
21ba0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21bb0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
21bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21bd0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
21be0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
21bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21c10 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
21c20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
21c30 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
21c40 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
21c50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
21c60 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20  ET_SQL_FUNC.    
21c70 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
21c80 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
21c90 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20  UNC_OFFSET ){.  
21ca0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
21cb0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
21cc0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
21cd0 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43  ( pArg->op==TK_C
21ce0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
21cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d00 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
21d10 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c  t, pArg->iTable,
21d20 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pArg->iColumn, 
21d30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21d60 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
21d70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
21d80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21d90 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
21da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21db0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50  VdbeAddOp4(v, pP
21dc0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f  arse->iSelfTab ?
21dd0 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20   OP_PureFunc0 : 
21de0 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20  OP_Function0,.  
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
21e10 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28  k, r1, target, (
21e20 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
21e30 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
21e40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
21e50 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
21e60 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
21e70 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63    if( nFarg && c
21e80 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  onstMask==0 ){. 
21e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
21ea0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
21eb0 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
21ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21ed0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
21ee0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21ef0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21f00 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
21f10 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
21f20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
21f30 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
21f40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21f50 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
21f60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21f70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
21f80 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
21f90 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20  SELECT && (nCol 
21fa0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
21fb0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
21fc0 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  r)!=1 ){.       
21fd0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
21fe0 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e  tError(pParse, n
21ff0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Col, 1);.      }
22000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
22010 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65  turn sqlite3Code
22020 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
22030 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
22040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
22050 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22060 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ase TK_SELECT_CO
22070 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
22080 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t n;.      if( p
22090 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
220a0 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
220b0 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
220c0 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
220d0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
220e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
220f0 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ft, 0, 0);.     
22100 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
22110 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22120 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66  0 || pExpr->pLef
22130 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
22140 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
22150 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  xpr->iTable.    
22160 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
22170 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65  ble!=(n = sqlite
22180 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
22190 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a  pExpr->pLeft)) .
221a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
221b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
221c0 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
221d0 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
221e0 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
22210 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20  >iTable, n);.   
22220 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
22230 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  n pExpr->pLeft->
22240 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e  iTable + pExpr->
22250 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20  iColumn;.    }. 
22260 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
22270 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
22280 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
22290 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
222a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
222b0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
222c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
222d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
222e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
222f0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
22300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22310 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
22320 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
22330 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
22340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22360 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
22370 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
22380 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22390 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
223a0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
223b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
223c0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
223d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
223e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
223f0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
22400 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
22410 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
22420 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22430 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
22440 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
22450 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
22460 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
22470 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
22480 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
22490 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
224a0 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
224b0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
224c0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
224d0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
224e0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
224f0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
22500 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
22510 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
22520 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
22530 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
22540 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
22550 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64   {.      exprCod
22560 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
22570 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
22580 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  0, 0);.      ret
22590 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
225a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50  }.    case TK_SP
225b0 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AN:.    case TK_
225c0 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61  COLLATE: .    ca
225d0 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
225e0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
225f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
22600 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
22610 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
22620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
22630 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
22640 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
22650 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
22660 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
22670 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
22680 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
22690 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
226a0 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
226b0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
226c0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
226d0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
226e0 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
226f0 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
22700 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
22710 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
22720 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
22730 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
22740 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22750 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
22760 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
22770 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
22780 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
22790 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
227a0 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
227b0 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
227c0 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
227d0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
227e0 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
227f0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
22800 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
22810 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
22820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
22830 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
22840 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
22850 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
22860 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
22870 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
22880 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
22890 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
228a0 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
228b0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
228c0 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
228d0 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
228e0 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
228f0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
22900 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
22910 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
22920 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
22930 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
22940 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
22950 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
22960 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
22970 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
22980 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
22990 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
229a0 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
229b0 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
229c0 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
229d0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
229e0 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
229f0 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
22a00 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
22a10 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
22a20 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
22a30 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
22a40 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
22a50 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
22a60 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
22a70 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
22a80 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
22a90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
22aa0 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
22ab0 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
22ac0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
22ad0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
22ae0 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
22af0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
22b00 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
22b10 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
22b20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
22b30 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
22b40 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
22b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
22b60 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
22b70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
22b80 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
22b90 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
22ba0 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
22bb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
22bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22bd0 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
22be0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
22bf0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22c00 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
22c10 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
22c20 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
22c30 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
22c40 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
22c50 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
22c60 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
22c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22c80 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
22c90 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
22ca0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
22cb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22cc0 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
22cd0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
22ce0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
22cf0 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
22d00 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
22d10 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
22d20 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
22d30 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
22d40 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
22d50 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
22d60 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
22d70 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
22d80 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
22d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22da0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
22db0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
22dc0 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
22dd0 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
22de0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
22df0 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
22e00 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
22e10 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
22e20 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
22e30 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
22e40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22e50 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
22e60 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51  R-60985-57662 SQ
22e70 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72  Lite will conver
22e80 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b  t the value back
22e90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f   to.      ** flo
22ea0 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e  ating point when
22eb0 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66   extracting it f
22ec0 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
22ed0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
22ee0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
22ef0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
22f00 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
22f10 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
22f20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
22f30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22f50 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
22f60 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
22f70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
22f80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22f90 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  }..    case TK_V
22fa0 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  ECTOR: {.      s
22fb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22fc0 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
22fd0 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
22fe0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f  .    case TK_IF_
23000 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20  NULL_ROW: {.    
23010 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20    int addrINR;. 
23020 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73       addrINR = s
23030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
23040 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77  (v, OP_IfNullRow
23050 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
23060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23070 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
23080 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  rse);.      inRe
23090 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
230a0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
230b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
230c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
230d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
230e0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
230f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
23100 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52  pHere(v, addrINR
23110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23120 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
23130 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b  addrINR, inReg);
23140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23150 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
23160 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a  ** Form A:.    *
23170 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20  *   CASE x WHEN 
23180 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
23190 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
231a0 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
231b0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
231c0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a  .    ** Form B:.
231d0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
231e0 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
231f0 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
23200 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
23210 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
23220 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
23230 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e  A is can be tran
23240 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65  sformed into the
23250 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d   equivalent form
23260 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20   B as follows:. 
23270 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
23280 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57  N x=e1 THEN r1 W
23290 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32  HEN x=e2 THEN r2
232a0 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20   ....    **     
232b0 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45     WHEN x=eN THE
232c0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
232d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
232e0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
232f0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  s in pExpr->pLef
23300 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69  t..    ** Y is i
23310 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  n the last eleme
23320 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70  nt of pExpr->x.p
23330 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78  List if pExpr->x
23340 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73  .pList->nExpr is
23350 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68  .    ** odd.  Th
23360 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
23370 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75  onal.  If the nu
23380 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
23390 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20   in x.pList.    
233a0 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e  ** is even, then
233b0 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e   Y is omitted an
233c0 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65  d the "otherwise
233d0 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  " result is NULL
233e0 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
233f0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
23400 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
23410 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
23420 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
23430 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
23440 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
23450 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
23460 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
23470 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
23480 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
23490 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
234a0 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
234b0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
234c0 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
234d0 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
234e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
234f0 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53  sert( op==TK_CAS
23500 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  E ); {.      int
23510 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23530 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
23540 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
23550 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
23560 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23580 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
23590 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
235a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
235b0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
235c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
235d0 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
235e0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
235f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23620 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
23630 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
23640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23650 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
23660 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
23670 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23680 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
23690 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
236a0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
236b0 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
236d0 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
236e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
236f0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
23720 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
23730 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
23760 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
23770 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
23780 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43  VVA_ONLY( int iC
23790 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72  acheLevel = pPar
237a0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
237b0 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   )..      assert
237c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
237d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
237e0 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
237f0 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
23800 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
23810 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
23820 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
23830 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
23840 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
23850 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
23860 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
23870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
23880 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
23890 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
238a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
238b0 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
238c0 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
238d0 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58       tempX = *pX
238e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
238f0 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  se( pX->op==TK_C
23900 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
23910 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
23920 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65  &tempX, exprCode
23930 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26  Vector(pParse, &
23940 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
23950 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
23960 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
23970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
23980 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20  set(&opCompare, 
23990 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70  0, sizeof(opComp
239a0 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f  are));.        o
239b0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
239c0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
239d0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
239e0 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
239f0 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
23a00 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
23a10 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
23a20 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
23a30 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
23a40 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
23a50 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
23a60 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
23a70 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
23a80 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
23a90 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
23aa0 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
23ab0 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
23ac0 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
23ad0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
23ae0 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
23af0 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
23b00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
23b10 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
23b20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
23b30 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
23b40 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
23b50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
23b60 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
23b70 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23b90 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23ba0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23bb0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
23bc0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
23bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23be0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
23bf0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23c10 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23c20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23c30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
23c40 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
23c50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
23c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23c70 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
23c80 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
23c90 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
23ca0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
23cb0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
23cc0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
23cd0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
23ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23cf0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
23d00 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
23d10 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
23d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23d30 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
23d40 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
23d50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23d60 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
23d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23d80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23d90 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23da0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23db0 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23dc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23dd0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
23de0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23df0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
23e00 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78  e, pEList->a[nEx
23e10 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  pr-1].pExpr, tar
23e20 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
23e30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
23e40 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
23e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
23e80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
23e90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
23ea0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
23eb0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
23ec0 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
23ed0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
23ee0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
23ef0 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
23f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
23f10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
23f20 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
23f30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
23f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23f50 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
23f60 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
23f70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
23f80 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23f90 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
23fa0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
23fb0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
23fc0 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
23fd0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23fe0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
23ff0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
24000 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
24010 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
24020 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
24030 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
24040 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24050 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
24080 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
24090 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
240a0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
240b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
240c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
240d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
240e0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
240f0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
24100 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
24110 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
24120 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
24130 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
24140 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
24150 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
24160 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
24170 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24180 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
24190 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
241a0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
241b0 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
241c0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
241d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
241e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
241f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24200 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
24210 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
24220 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24230 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24250 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
24260 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
24270 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
24280 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
24290 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
242a0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
242b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
242c0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
242d0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
242e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
242f0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
24300 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
24310 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
24320 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
24330 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
24340 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
24350 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ion time..**.** 
24360 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68  If regDest>=0 th
24370 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
24380 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69   always stored i
24390 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
243a0 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  and the.** resul
243b0 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c  t is not reusabl
243c0 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c 30  e.  If regDest<0
243d0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
243e0 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a  ne is free to .*
243f0 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * store the valu
24400 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20 77  e whereever it w
24410 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73  ants.  The regis
24420 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65 78  ter where the ex
24430 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20  pression .** is 
24440 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e  stored is return
24450 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73  ed.  When regDes
24460 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63  t<0, two identic
24470 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77  al expressions w
24480 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74  ill.** code to t
24490 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
244a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
244b0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
244c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
244d0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
244e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
244f0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
24500 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
24510 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
24520 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
24530 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
24540 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st       /* Stor
24550 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
24560 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
24570 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
24580 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
24590 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
245a0 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
245b0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
245c0 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 26   if( regDest<0 &
245d0 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63  & p ){.    struc
245e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
245f0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20  *pItem;.    int 
24600 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  i;.    for(pItem
24610 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70  =p->a, i=p->nExp
24620 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c  r; i>0; pItem++,
24630 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   i--){.      if(
24640 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
24650 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
24660 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e  ompare(0,pItem->
24670 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d  pExpr,pExpr,-1)=
24680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
24690 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
246a0 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
246b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
246c0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
246d0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
246e0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
246f0 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
24700 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
24710 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
24720 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
24730 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
24740 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
24750 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
24760 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61      pItem->reusa
24770 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b  ble = regDest<0;
24780 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65 73  .     if( regDes
24790 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d 20  t<0 ) regDest = 
247a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
247b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
247c0 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
247d0 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61  gDest;.  }.  pPa
247e0 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
247f0 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  = p;.  return re
24800 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  gDest;.}../*.** 
24810 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
24820 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
24830 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
24840 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
24850 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
24860 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
24870 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
24880 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
24890 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
248a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
248b0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
248c0 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
248d0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
248e0 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
248f0 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
24900 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
24910 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
24920 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
24930 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
24940 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
24950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
24960 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20   is a constant, 
24970 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24980 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65  e might generate
24990 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f   this.** code to
249a0 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74   fill the regist
249b0 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  er in the initia
249c0 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  lization section
249d0 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   of the.** VDBE 
249e0 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65  program, in orde
249f0 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
24a00 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61  ut of the evalua
24a10 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  tion loop..*/.in
24a20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
24a30 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
24a40 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24a50 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
24a60 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20  int r2;.  pExpr 
24a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
24a80 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
24a90 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74  .  if( ConstFact
24aa0 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20  orOk(pParse).   
24ab0 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
24ac0 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20  _REGISTER.   && 
24ad0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
24ae0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
24af0 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52  pr).  ){.    *pR
24b00 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20  eg  = 0;.    r2 
24b10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24b20 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
24b30 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65  pExpr, -1);.  }e
24b40 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  lse{.    int r1 
24b50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
24b60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
24b70 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
24b80 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
24b90 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
24ba0 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29      if( r2==r1 )
24bb0 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  {.      *pReg = 
24bc0 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r1;.    }else{. 
24bd0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
24be0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24bf0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70  e, r1);.      *p
24c00 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
24c10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
24c20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24c30 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
24c40 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
24c50 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
24c60 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
24c70 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
24c80 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
24c90 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
24ca0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
24cb0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
24cc0 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  get..*/.void sql
24cd0 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
24ce0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24cf0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24d00 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
24d10 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
24d20 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
24d30 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
24d40 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
24d50 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52   pExpr->op==TK_R
24d60 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73  EGISTER ){.    s
24d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24d80 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
24d90 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e  OP_Copy, pExpr->
24da0 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
24db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
24dc0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
24dd0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
24de0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24df0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
24e00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
24e10 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
24e20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
24e30 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
24e40 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
24e50 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
24e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
24e80 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
24e90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
24ea0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
24eb0 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63  ke a transient c
24ec0 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
24ed0 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e  n pExpr and then
24ee0 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a   code it using.*
24ef0 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
24f00 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  e().  This routi
24f10 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  ne works just li
24f20 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ke sqlite3ExprCo
24f30 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74  de().** except t
24f40 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78  hat the input ex
24f50 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72  pression is guar
24f60 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63  anteed to be unc
24f70 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
24f80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
24f90 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  opy(Parse *pPars
24fa0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24fb0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73  int target){.  s
24fc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24fd0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72  rse->db;.  pExpr
24fe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
24ff0 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
25000 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
25010 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74  ocFailed ) sqlit
25020 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
25030 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
25040 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
25050 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
25060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
25070 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
25080 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
25090 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
250a0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
250b0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
250c0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
250d0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
250e0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
250f0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
25100 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20  target.  If the 
25110 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
25120 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
25130 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
25140 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64  ht choose to cod
25150 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
25160 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   at initializati
25170 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
25180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25190 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65  Factorable(Parse
251a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
251b0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
251c0 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t){.  if( pParse
251d0 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
251e0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
251f0 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
25200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
25210 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
25220 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25230 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
25240 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25250 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
25260 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
25270 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
25280 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
25290 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
252a0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
252b0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
252c0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
252d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
252e0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
252f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
25300 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
25310 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
25320 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
25330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25340 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
25350 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
25360 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
25370 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
25380 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
25390 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
253a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
253b0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
253c0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
253d0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
253e0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
253f0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
25400 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
25410 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
25420 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
25430 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
25440 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
25450 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25460 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
25470 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
25480 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
25490 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
254a0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
254b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
254c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
254d0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
254e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
254f0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25500 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
25510 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
25520 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25530 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
25540 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
25550 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
25560 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
25570 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25580 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
25590 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
255a0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
255b0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
255c0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
255d0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
255e0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
255f0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
25600 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25610 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
25620 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
25630 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
25640 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
25650 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
25660 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
25670 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
25680 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
25690 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
256a0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
256b0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
256c0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
256d0 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
256e0 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
256f0 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
25700 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
25710 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25720 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
25730 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
25740 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
25750 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
25760 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
25770 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
25780 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25790 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
257a0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
257b0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
257c0 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
257d0 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
257e0 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
257f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
25800 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
25810 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
25820 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
25830 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
25840 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
25850 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
25860 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25870 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
25880 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
25890 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
258a0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
258b0 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
258c0 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
258d0 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
258e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
258f0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
25900 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25910 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
25920 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
25930 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
25940 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
25950 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
25960 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
25970 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
25980 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
25990 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
259a0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
259b0 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
259c0 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
259d0 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
259e0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
259f0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
25a00 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
25a10 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
25a20 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
25a30 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
25a40 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
25a50 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
25a60 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
25a70 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
25a80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
25a90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
25aa0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
25ab0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
25ac0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25ad0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
25ae0 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
25af0 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
25b00 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
25b10 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
25b20 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
25b30 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
25b40 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25b50 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
25b60 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
25b70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
25b80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
25b90 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
25ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25bb0 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
25bc0 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
25bd0 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
25be0 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
25bf0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
25c00 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25c10 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25c20 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
25c30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
25c40 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
25c50 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
25c60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25c70 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
25c80 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
25c90 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
25ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
25cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25cc0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
25cd0 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
25ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25cf0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
25d00 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25d10 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
25d20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
25d30 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
25d40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25d50 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
25d60 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
25d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25d80 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
25d90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25da0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
25db0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
25dc0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
25dd0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
25de0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
25df0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
25e00 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
25e10 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
25e20 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
25e30 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
25e40 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
25e50 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
25e60 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
25e70 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
25e80 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
25e90 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
25ea0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
25eb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
25ec0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
25ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25ee0 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
25ef0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25f00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25f10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25f20 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
25f30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
25f40 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
25f50 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
25f60 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
25f70 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
25f80 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
25f90 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
25fa0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
25fb0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
25fc0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
25fd0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
25fe0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
25ff0 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
26000 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
26010 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
26020 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
26030 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26050 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
26060 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
26070 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
26080 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
26090 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
260a0 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
260b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
260c0 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
260d0 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
260e0 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
260f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
26100 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
26110 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
26120 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
26130 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
26140 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
26150 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
26160 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
26170 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
26180 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
26190 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
261a0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
261b0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
261c0 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
261d0 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
261e0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
261f0 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
26200 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
26210 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
26220 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
26230 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
26240 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
26250 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
26260 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72  */.){. Expr expr
26270 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
26280 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
26290 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
262a0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
262b0 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
262c0 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
262d0 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
262e0 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
262f0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
26300 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
26310 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
26320 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
26330 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
26340 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
26350 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73  ster */...  mems
26360 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c  et(&compLeft, 0,
26370 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
26380 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69    memset(&compRi
26390 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ght, 0, sizeof(E
263a0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
263b0 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a  &exprAnd, 0, siz
263c0 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61  eof(Expr));..  a
263d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
263e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
263f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
26400 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
26410 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
26420 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
26430 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
26440 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
26450 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
26460 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
26470 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
26480 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
26490 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
264a0 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
264b0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
264c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
264d0 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
264e0 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
264f0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
26500 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
26510 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
26520 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
26530 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
26540 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72  ter(&exprX, expr
26550 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
26560 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
26570 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a  ree1));.  if( xJ
26580 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70  ump ){.    xJump
26590 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
265a0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
265b0 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
265c0 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65     /* Mark the e
265d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69  xpression is bei
265e0 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  ng from the ON o
265f0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
26600 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20  f a join.    ** 
26610 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
26620 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
26630 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
26640 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
26650 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  move.    ** it i
26660 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43  nto the Parse.pC
26670 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20  onstExpr list.  
26680 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20  We should use a 
26690 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73  new bit for this
266a0 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61  ,.    ** for cla
266b0 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
266c0 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
266d0 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
266e0 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a  ield so we.    *
266f0 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20  * have to reuse 
26700 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
26710 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f  bit.  Bummer. */
26720 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73  .    exprX.flags
26730 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
26740 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26750 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
26760 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
26770 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
26780 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26790 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
267a0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
267b0 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
267c0 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
267d0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
267e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
267f0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26800 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
26810 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26820 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26830 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26840 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
26850 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
26860 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26870 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26880 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26890 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
268a0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
268b0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
268c0 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
268d0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
268e0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
268f0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26900 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26910 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26920 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26930 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
26940 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26950 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26960 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
26970 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
26980 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26990 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
269a0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
269b0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
269c0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
269d0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
269e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
269f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
26a00 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26a10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26a20 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ump==0 );.}../*.
26a30 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
26a40 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
26a50 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
26a60 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
26a70 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
26a80 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
26a90 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
26aa0 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
26ab0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
26ac0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
26ad0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26ae0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
26af0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26b00 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
26b10 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
26b20 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
26b30 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
26b40 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
26b50 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
26b60 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
26b70 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
26b80 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
26b90 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
26ba0 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
26bb0 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
26bc0 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
26bd0 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
26be0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
26bf0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
26c00 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
26c10 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
26c20 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
26c30 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
26c40 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
26c50 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
26c60 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
26c70 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
26c80 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
26c90 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
26ca0 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
26cb0 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
26cc0 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
26cd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26ce0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
26cf0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
26d00 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
26d10 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
26d20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26d30 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26d40 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
26d50 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26d60 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26d70 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26d80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26d90 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26da0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26db0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26dc0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26dd0 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
26de0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
26df0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
26e00 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
26e10 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
26e20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
26e30 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
26e40 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
26e50 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
26e60 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
26e70 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
26e80 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
26e90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
26ea0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
26eb0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26ec0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26ed0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26ee0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26ef0 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
26f00 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
26f10 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
26f20 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
26f30 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
26f40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26f50 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
26f60 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
26f70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
26f90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
26fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26fb0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
26fc0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
26fd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26fe0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
26ff0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27000 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27010 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27020 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27030 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27040 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27050 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27060 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
27070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27080 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27090 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
270a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
270b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
270c0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
270d0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
270e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
270f0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
27100 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27110 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27120 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27130 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27140 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27150 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27170 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
27180 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
27190 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20   isNot;      /* 
271a0 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
271b0 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
271c0 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
271d0 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
271e0 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
271f0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
27200 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27210 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
27220 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
27230 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
27240 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
27250 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
27260 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
27270 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
27280 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
27290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
272a0 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
272b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
272c0 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
272d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
272e0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
272f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27300 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
27320 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
27330 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
27340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27360 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
27370 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
27380 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
273a0 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d  Not ? SQLITE_JUM
273b0 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20  PIFNULL : 0);.  
273c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
273d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
273e0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
273f0 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
27400 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27410 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
27420 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27430 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
27440 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
27450 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
27460 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
27470 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
27480 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
27490 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
274a0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
274b0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
274c0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
274d0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
274e0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
274f0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
27500 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27510 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
27520 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
27530 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
27540 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27550 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27560 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27570 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27580 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27590 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
275a0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
275b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
275c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
275d0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
275e0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
275f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27600 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
27610 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
27630 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
27640 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
27650 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
27660 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
27670 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
27680 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27690 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
276a0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
276b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
276c0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
276d0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
276e0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
276f0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
27700 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27710 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
27720 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
27730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27740 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
27750 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
27760 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27770 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
27780 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27790 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
277a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
277b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
277c0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
277d0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
277e0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
277f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27800 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27810 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
27820 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
27830 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27840 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
27850 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
27860 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
27870 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27880 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27890 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
278a0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
278b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
278c0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
278d0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
278e0 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
278f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27900 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
27910 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
27920 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
27930 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27940 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
27950 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
27960 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27970 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
27980 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
27990 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
279a0 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
279b0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
279c0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
279d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
279e0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
279f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27a00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27a10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27a20 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27a40 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
27a50 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
27a60 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27a70 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
27a80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27a90 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
27aa0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
27ab0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27ac0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
27ad0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27ae0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
27af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27b00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27b10 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
27b20 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
27b30 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
27b40 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d  3ExprIfTrue, jum
27b50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
27b70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27b80 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
27b90 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
27ba0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
27bb0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
27bc0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
27bd0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
27be0 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
27bf0 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
27c00 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
27c10 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
27c20 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
27c30 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
27c40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27c50 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
27c60 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
27c70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
27c80 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
27c90 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
27ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27cb0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
27cc0 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a    default_expr:.
27cd0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
27ce0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
27cf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27d00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
27d10 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27d20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
27d30 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
27d40 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
27d50 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
27d60 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
27d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
27d80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27d90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27da0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27db0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
27dc0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
27dd0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
27de0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27df0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
27e00 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27e10 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
27e20 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27e30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
27e40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27e50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27e60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27e70 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
27e80 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27e90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27ea0 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
27eb0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
27ec0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
27ed0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
27ee0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
27ef0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
27f00 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
27f10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27f20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
27f30 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
27f40 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
27f50 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
27f60 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
27f70 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
27f80 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
27f90 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
27fa0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
27fb0 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
27fc0 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
27fd0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
27fe0 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
27ff0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
28000 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
28010 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28020 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
28030 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
28040 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
28050 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
28060 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28070 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
28080 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
28090 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
280a0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
280b0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
280c0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
280d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
280e0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
280f0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
28100 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
28110 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
28120 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
28130 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
28140 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
28150 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
28160 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
28170 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
28180 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
28190 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
281a0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
281b0 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
281c0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
281d0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
281e0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
281f0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
28200 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
28210 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
28220 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
28230 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
28240 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
28250 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
28260 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
28270 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
28280 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
28290 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
282a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
282b0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
282c0 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
282d0 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
282e0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
282f0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
28300 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
28310 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
28320 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
28330 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
28340 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
28350 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
28360 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
28370 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
28380 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
28390 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
283a0 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
283b0 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
283c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
283d0 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
283e0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
283f0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
28400 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
28410 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
28420 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
28430 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
28440 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
28450 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
28460 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
28470 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
28480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
28490 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
284a0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
284b0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
284c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
284d0 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
284e0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
284f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
28500 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
28510 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
28520 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
28530 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
28540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28550 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
28560 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
28570 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28580 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
28590 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
285a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
285b0 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
285c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
285d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
285e0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
285f0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
28600 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
28610 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
28620 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28630 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28640 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28650 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
28660 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
28670 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28680 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28690 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
286a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
286b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
286c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
286d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
286e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
286f0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
28700 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
28710 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28720 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
28730 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
28740 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
28750 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28760 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
28770 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
28780 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28790 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
287a0 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
287b0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
287c0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
287d0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
287e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
287f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28800 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28810 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28820 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28830 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28840 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
28850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28860 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
28870 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
28880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28890 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
288a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
288b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
288c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
288d0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
288e0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
288f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28910 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
28920 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  H: {.      int i
28930 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f  sNot;   /* IS NO
28940 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  T TRUE or IS NOT
28950 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
28960 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f 2a 20  int isTrue;  /* 
28970 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  IS TRUE or IS NO
28980 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
28990 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
289a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
289b0 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e   isNot = pExpr->
289c0 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20  op2==TK_ISNOT;. 
289d0 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
289e0 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
289f0 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
28a00 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
28a10 73 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73  se( isTrue && is
28a20 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
28a30 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26  tcase( !isTrue &
28a40 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
28a50 20 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73   if( isTrue ^ is
28a60 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Not ){.        /
28a70 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20 49 53  * IS TRUE and IS
28a80 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20   NOT FALSE */.  
28a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28aa0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28ab0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28ac0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49  isNot ? 0 : SQLI
28af0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
28b00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28b10 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41 4c 53        /* IS FALS
28b20 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54 52 55  E and IS NOT TRU
28b30 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28b40 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
28b50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28b60 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a       isNot ? 0 :
28b90 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
28ba0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
28bb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28bc0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
28bd0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
28be0 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
28bf0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
28c00 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
28c10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
28c20 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
28c30 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
28c40 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
28c50 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
28c60 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
28c70 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
28c80 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
28c90 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
28ca0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
28cb0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
28cc0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
28cd0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
28ce0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
28cf0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
28d00 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
28d10 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
28d20 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
28d30 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
28d40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28d50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
28d60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
28d70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28d80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
28d90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
28da0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
28db0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
28dc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28dd0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
28de0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
28df0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28e00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
28e10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
28e20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
28e30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28e40 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
28e50 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
28e60 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28e70 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
28e80 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
28e90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28ea0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
28eb0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
28ec0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
28ed0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
28ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28ef0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
28f00 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
28f10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28f20 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
28f30 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
28f40 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
28f50 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
28f60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28f70 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
28f80 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
28f90 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
28fa0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
28fb0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28fc0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
28fd0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
28fe0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28ff0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29000 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
29010 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
29020 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
29030 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
29040 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
29050 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
29060 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
29070 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
29080 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
29090 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
290a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
290b0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
290c0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
290d0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
290e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
290f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
29100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29110 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
29120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29130 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
29140 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
29150 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
29160 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
29170 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
29180 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
29190 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
291a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
291b0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
291c0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
291d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
291e0 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65  ISNULL );   Vdbe
291f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29200 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
29210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
29220 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20  ==TK_NOTNULL ); 
29230 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
29240 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
29250 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
29260 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
29270 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
29280 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
29290 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
292a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
292b0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
292c0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
292d0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
292e0 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
292f0 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d  ExprIfFalse, jum
29300 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
29310 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
29320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29330 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
29340 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
29350 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
29360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29370 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
29380 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
29390 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
293a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
293b0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
293c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
293d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
293e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
293f0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
29400 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
29410 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
29420 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29430 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
29440 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
29450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
29460 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
29470 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c  lt: {.    defaul
29480 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69  t_expr: .      i
29490 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
294a0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
294b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
294c0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
294d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
294e0 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
294f0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
29500 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
29510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29520 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
29530 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
29540 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
29550 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
29560 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
29570 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
29580 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
29590 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
295a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
295b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
295c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
295d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
295e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
295f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29600 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29610 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
29620 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
29630 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
29640 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
29650 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
29660 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
29670 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
29680 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70  rIfFalse() excep
29690 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73  t that a copy is
296a0 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62   made of pExpr b
296b0 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65  efore.** code ge
296c0 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  neration, and th
296d0 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74  at copy is delet
296e0 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65  ed after code ge
296f0 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a  neration. This.*
29700 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  * ensures that t
29710 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70  he original pExp
29720 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  r is unchanged..
29730 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
29740 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61  xprIfFalseDup(Pa
29750 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
29760 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
29770 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  st,int jumpIfNul
29780 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
29790 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
297a0 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
297b0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
297c0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
297d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
297e0 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  iled==0 ){.    s
297f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29800 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c  e(pParse, pCopy,
29810 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
29820 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
29830 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
29840 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pCopy);.}../*.**
29850 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72   Expression pVar
29860 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
29870 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69  o be an SQL vari
29880 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20  able. pExpr may 
29890 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f  be any.** type o
298a0 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  f expression..**
298b0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
298c0 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
298d0 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c  ue - an integer,
298e0 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62   real, string, b
298f0 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76  lob.** or NULL v
29900 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20  alue - then the 
29910 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62  VDBE currently b
29920 65 69 6e 67 20 70 72 65 70 61 72 65 64 20 69 73  eing prepared is
29930 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
29940 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65 61 63  o re-prepare eac
29950 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c  h time a new val
29960 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76  ue is bound to v
29970 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a  ariable pVar..**
29980 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
29990 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  , if pExpr is a 
299a0 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65  simple SQL value
299b0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
299c0 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  s the.** same as
299d0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
299e0 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
299f0 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f  e pVar, non-zero
29a00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
29a10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
29a20 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  he values are no
29a30 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66  t the same or if
29a40 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
29a50 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61  simple.** SQL va
29a60 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74  lue, zero is ret
29a70 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29a80 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65   int exprCompare
29a90 56 61 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a  Variable(Parse *
29aa0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56  pParse, Expr *pV
29ab0 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ar, Expr *pExpr)
29ac0 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
29ad0 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73  .  int iVar;.  s
29ae0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c  qlite3_value *pL
29af0 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20  , *pR = 0;.  .  
29b00 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
29b10 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
29b20 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   pExpr, SQLITE_U
29b30 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  TF8, SQLITE_AFF_
29b40 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66  BLOB, &pR);.  if
29b50 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72  ( pR ){.    iVar
29b60 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e   = pVar->iColumn
29b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29b80 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
29b90 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
29ba0 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74  ;.    pL = sqlit
29bb0 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
29bc0 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70  lue(pParse->pRep
29bd0 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51  repare, iVar, SQ
29be0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a  LITE_AFF_BLOB);.
29bf0 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20      if( pL ){.  
29c00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
29c10 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d  value_type(pL)==
29c20 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
29c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
29c40 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f  alue_text(pL); /
29c50 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
29c60 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d  encoding is UTF-
29c70 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  8 */.      }.   
29c80 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c     res =  0==sql
29c90 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
29ca0 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d  L, pR, 0);.    }
29cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
29cc0 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73  eFree(pR);.    s
29cd0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
29ce0 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pL);.  }..  retu
29cf0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
29d00 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
29d10 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
29d20 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
29d30 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
29d40 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
29d50 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
29d60 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
29d70 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
29d80 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
29d90 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
29da0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
29db0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
29dc0 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
29dd0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
29de0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
29df0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
29e00 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
29e10 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
29e20 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
29e30 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
29e40 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
29e50 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
29e60 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
29e70 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
29e80 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
29e90 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
29ea0 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
29eb0 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
29ec0 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
29ed0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
29ee0 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
29ef0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
29f00 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
29f10 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
29f20 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
29f30 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
29f40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
29f50 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
29f60 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
29f70 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
29f80 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
29f90 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
29fa0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
29fb0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
29fc0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
29fd0 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
29fe0 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
29ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a000 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
2a010 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
2a020 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
2a030 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
2a040 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
2a050 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
2a060 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
2a070 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
2a080 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
2a090 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
2a0a0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
2a0b0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
2a0c0 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
2a0d0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
2a0e0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
2a0f0 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
2a100 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
2a110 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
2a120 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
2a130 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
2a140 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
2a150 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
2a160 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
2a170 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
2a180 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
2a190 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
2a1a0 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65  n TK_VARIABLE te
2a1b0 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20 62  rms in pA with b
2a1c0 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50  indings in.** pP
2a1d0 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
2a1e0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
2a1f0 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73  against literals
2a200 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a   in pB.  The .**
2a210 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
2a220 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20  expmask bitmask 
2a230 69 73 20 75 70 64 61 74 65 64 20 66 6f 72 20 65  is updated for e
2a240 61 63 68 20 76 61 72 69 61 62 6c 65 20 72 65 66  ach variable ref
2a250 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70  erenced..** If p
2a260 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74  Parse is NULL (t
2a270 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20  he normal case) 
2a280 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49  then any TK_VARI
2a290 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a  ABLE term in .**
2a2a0 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65   Argument pParse
2a2b0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
2a2c0 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20   be NULL. If it 
2a2d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
2a2e0 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73  pA or.** pB caus
2a2f0 65 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75  es a return valu
2a300 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73  e of 2..*/.int s
2a310 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a320 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2a330 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20   Expr *pA, Expr 
2a340 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
2a350 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
2a360 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
2a370 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
2a380 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
2a390 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66   0 : 2;.  }.  if
2a3a0 28 20 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e  ( pParse && pA->
2a3b0 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
2a3c0 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61  && exprCompareVa
2a3d0 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  riable(pParse, p
2a3e0 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65  A, pB) ){.    re
2a3f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f  turn 0;.  }.  co
2a400 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
2a410 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
2a420 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
2a430 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
2a440 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
2a450 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
2a460 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
2a470 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
2a480 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
2a490 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
2a4a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2a4b0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
2a4c0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
2a4d0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
2a4e0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
2a4f0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
2a500 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2a510 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54   pA->pLeft,pB,iT
2a520 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
2a530 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2a540 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
2a550 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a560 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a570 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70  pParse, pA,pB->p
2a580 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a  Left,iTab)<2 ){.
2a590 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a5a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2a5b0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
2a5c0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2a5d0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  && pA->op!=TK_AG
2a5e0 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  G_COLUMN && pA->
2a5f0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
2a600 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46  if( pA->op==TK_F
2a610 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20  UNCTION ){.     
2a620 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2a630 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
2a640 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
2a650 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
2a660 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2a670 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a680 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a690 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a6a0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2a6b0 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
2a6c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
2a6d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a6e0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
2a6f0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a700 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a710 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
2a720 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
2a730 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
2a740 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
2a750 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
2a760 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
2a770 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2a780 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2a790 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20  rse, pA->pLeft, 
2a7a0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
2a7b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a7c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2a7d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2a7e0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
2a7f0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
2a800 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2a810 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2a820 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
2a830 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
2a840 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2a850 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
2a860 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
2a870 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
2a880 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d  ==0) && pA->op!=
2a890 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
2a8a0 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a8b0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a8c0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a8d0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2a8e0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2a8f0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2a900 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2a910 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2a920 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2a930 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a940 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2a950 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2a960 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2a970 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2a980 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2a990 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2a9a0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2a9b0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2a9c0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2a9d0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2a9e0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2a9f0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2aa00 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2aa10 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2aa20 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2aa30 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2aa40 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2aa50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2aa60 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2aa70 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2aa80 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2aa90 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2aaa0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2aab0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2aac0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2aad0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2aae0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2aaf0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2ab00 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2ab10 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2ab20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2ab30 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2ab40 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2ab50 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2ab60 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2ab70 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2ab80 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2ab90 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2aba0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2abb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2abc0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2abd0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2abe0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2abf0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2ac00 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2ac10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2ac20 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2ac30 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2ac40 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2ac50 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2ac60 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2ac70 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2ac80 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2ac90 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2aca0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2acb0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2acc0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2acd0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2ace0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2acf0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2ad00 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2ad10 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ad20 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2ad30 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2ad40 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2ad50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ad60 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2ad70 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2ad80 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2ad90 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2ada0 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2adb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2adc0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2add0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2ade0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2adf0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2ae00 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ae20 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ae30 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2ae40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ae50 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2ae60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2ae70 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2ae80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2ae90 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2aea0 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2aeb0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2aec0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2aed0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2aee0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2aef0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2af00 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2af10 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2af20 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2af30 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2af40 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2af50 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2af60 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2af70 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2af80 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2af90 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2afa0 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2afb0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2afc0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2afd0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2afe0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2aff0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2b000 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2b010 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2b020 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2b030 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2b040 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2b050 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2b060 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b070 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2b080 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2b090 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2b0a0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b0b0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2b0c0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2b0d0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2b0e0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2b0f0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2b100 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2b110 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2b120 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2b130 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2b140 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2b150 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2b160 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2b170 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2b180 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2b190 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2b1a0 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2b1b0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2b1c0 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2b1d0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2b1e0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2b1f0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2b200 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2b210 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2b220 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2b230 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2b240 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2b250 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2b260 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2b270 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2b280 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2b290 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2b2a0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2b2b0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2b2c0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2b2d0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2b2e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2b2f0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2b300 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2b310 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2b320 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2b330 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2b340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b350 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2b360 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b370 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2b380 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2b390 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2b3a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2b3b0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2b3c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b3d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2b3e0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2b3f0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2b400 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2b410 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2b420 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2b430 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2b440 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b450 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b460 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2b470 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b480 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b490 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2b4a0 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2b4b0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2b4c0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2b4d0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2b4e0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b4f0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2b500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b510 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2b520 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b530 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b540 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2b550 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2b560 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b570 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b580 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2b590 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2b5a0 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2b5b0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b5c0 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2b5d0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2b5e0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2b5f0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2b600 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 61  ->iCur.** have a
2b610 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   non-NULL column
2b620 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b  , then set pWalk
2b630 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 61  er->eCode to 1 a
2b640 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74 61  nd abort..*/.sta
2b650 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2b660 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2b670 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2b680 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2b690 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2b6a0 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57 48  ly called for WH
2b6b0 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2b6c0 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69 74  ssions and so it
2b6d0 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61 76  .  ** cannot hav
2b6e0 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f 4c  e any TK_AGG_COL
2b6f0 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63 61  UMN entries beca
2b700 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f 6e  use those are on
2b710 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69 6e  ly found.  ** in
2b720 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2e   HAVING clauses.
2b730 20 20 57 65 20 63 61 6e 20 67 65 74 20 61 20 54    We can get a T
2b740 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 69  K_AGG_FUNCTION i
2b750 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
2b760 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20  ,.  ** but that 
2b770 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63 6f  is an illegal co
2b780 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68 65 20  nstruct and the 
2b790 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72 65  query will be re
2b7a0 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20 61  jected at.  ** a
2b7b0 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66 20   later stage of 
2b7c0 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20 74  processing, so t
2b7d0 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  he TK_AGG_FUNCTI
2b7e0 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  ON case does not
2b7f0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  .  ** need to be
2b800 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72 65   considered here
2b810 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2b820 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
2b830 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73  _COLUMN );.  tes
2b840 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b850 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2b860 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  N );..  if( Expr
2b870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2b880 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
2b890 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
2b8a0 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  ne;.  switch( pE
2b8b0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2b8c0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
2b8d0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
2b8e0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
2b8f0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  L:.    case TK_I
2b900 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  S:.    case TK_O
2b910 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  R:.    case TK_C
2b920 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASE:.    case TK
2b930 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
2b940 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2b950 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b960 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
2b970 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b980 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b990 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
2b9a0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b9b0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
2b9c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b9d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2b9e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b9f0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ba00 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2ba10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ba20 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2ba30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2ba40 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2ba50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ba60 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2ba70 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2ba80 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2ba90 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  e;.    case TK_C
2baa0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28  OLUMN:.      if(
2bab0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72   pWalker->u.iCur
2bac0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2bad0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  ){.        pWalk
2bae0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
2baf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2bb00 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2bb10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2bb20 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a  C_Prune;..    /*
2bb30 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   Virtual tables 
2bb40 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75  are allowed to u
2bb50 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c  se constraints l
2bb60 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a  ike x=NULL.  So.
2bb70 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66      ** a term of
2bb80 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f   the form x=y do
2bb90 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  es not prove tha
2bba0 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  t y is not null 
2bbb0 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74  if x.    ** is t
2bbc0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76  he column of a v
2bbd0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
2bbe0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2bbf0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2bc00 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2bc10 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2bc20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2bc30 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2bc40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bc50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
2bc60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2bc70 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bc80 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
2bc90 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2bca0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
2bcb0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bcc0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
2bcd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bce0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
2bcf0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2bd00 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bd10 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66  K_GE );.      if
2bd20 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ( (pExpr->pLeft-
2bd30 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2bd40 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2bd50 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29 29  r->pLeft->pTab))
2bd60 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70  .       || (pExp
2bd70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  r->pRight->op==T
2bd80 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2bd90 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69  rtual(pExpr->pRi
2bda0 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20  ght->pTab)).    
2bdb0 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75    ){.       retu
2bdc0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2bdd0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
2bde0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2bdf0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2be00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2be10 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
2be20 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  ) if expression 
2be30 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72  p can only be tr
2be40 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a  ue if at least.*
2be50 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * one column of 
2be60 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f  table iTab is no
2be70 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65  n-null.  In othe
2be80 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2be90 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65  true.** if expre
2bea0 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77  ssion p will alw
2beb0 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66  ays be NULL or f
2bec0 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f  alse if every co
2bed0 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2bee0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46  is NULL..**.** F
2bef0 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61  alse negatives a
2bf00 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20  re acceptable.  
2bf10 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2bf20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75  it is ok to retu
2bf30 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20  rn.** zero even 
2bf40 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2bf50 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
2bf60 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75  ue of every colu
2bf70 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2bf80 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20   NULL.  A false 
2bf90 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65  negative is mere
2bfa0 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69  ly a missed opti
2bfb0 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75  mization opportu
2bfc0 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  nity..**.** Fals
2bfd0 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20  e positives are 
2bfe0 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77  not allowed, how
2bff0 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70  ever.  A false p
2c000 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75  ositive may resu
2c010 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f  lt.** in an inco
2c020 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a  rrect answer..**
2c030 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74  .** Terms of p t
2c040 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77  hat are marked w
2c050 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  ith EP_FromJoin 
2c060 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20  (and hence that 
2c070 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  come from.** the
2c080 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2c090 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49  uses of LEFT JOI
2c0a0 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64  NS) are excluded
2c0b0 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73   from the analys
2c0c0 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  is..**.** This r
2c0d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
2c0e0 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46  o check if a LEF
2c0f0 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f  T JOIN can be co
2c100 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20  nverted into.** 
2c110 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
2c120 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e  .  The p argumen
2c130 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63  t is the WHERE c
2c140 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57  lause.  If the W
2c150 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72  HERE.** clause r
2c160 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d  equires that som
2c170 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
2c180 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74  right table of t
2c190 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20  he LEFT JOIN.** 
2c1a0 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  be non-NULL, the
2c1b0 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  n the LEFT JOIN 
2c1c0 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f  can be safely co
2c1d0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a  nverted into an.
2c1e0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e  ** ordinary join
2c1f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c200 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
2c210 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69  llRow(Expr *p, i
2c220 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b  nt iTab){.  Walk
2c230 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2c240 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65  allback = implie
2c250 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77  sNotNullRow;.  w
2c260 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c270 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63   = 0;.  w.xSelec
2c280 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2c290 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2c2a0 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62   w.u.iCur = iTab
2c2b0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2c2c0 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
2c2d0 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
2c2e0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2c2f0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c300 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2c310 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2c320 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2c330 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2c340 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2c350 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2c360 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2c370 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2c380 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2c390 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2c3a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2c3b0 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2c3c0 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2c3d0 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2c3e0 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2c3f0 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2c400 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2c410 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2c420 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2c430 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2c440 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2c450 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2c460 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2c470 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2c480 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2c490 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2c4a0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2c4b0 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2c4c0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2c4d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2c4e0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2c4f0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2c500 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2c510 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2c520 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2c530 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2c540 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2c550 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2c560 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2c570 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2c580 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2c590 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2c5a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2c5b0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2c5c0 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2c5d0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2c5e0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2c5f0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2c600 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c610 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2c620 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2c630 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2c640 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2c650 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2c660 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2c670 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2c680 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2c690 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2c6a0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2c6b0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2c6c0 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2c6d0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2c6e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2c6f0 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2c700 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2c710 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2c720 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2c730 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2c740 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2c750 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2c760 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2c770 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2c780 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2c790 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2c7a0 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2c7b0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2c7c0 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2c7d0 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2c7e0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2c7f0 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2c800 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2c810 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2c820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2c830 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2c840 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2c850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2c860 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2c870 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c890 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2c8a0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2c8b0 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2c8c0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2c8d0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2c8e0 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2c8f0 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2c900 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2c910 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2c920 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2c930 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2c940 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2c950 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2c960 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2c970 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2c980 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2c990 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2c9a0 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2c9b0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2c9c0 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2c9d0 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2c9e0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2c9f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2ca00 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2ca10 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2ca20 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2ca30 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2ca40 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2ca50 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2ca60 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2ca70 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2ca80 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2ca90 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2caa0 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2cab0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2cac0 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2cad0 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2cae0 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2caf0 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2cb00 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2cb10 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2cb20 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2cb30 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2cb40 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2cb50 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2cb60 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2cb70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2cb80 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2cb90 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2cba0 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2cbb0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2cbc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2cbd0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2cbe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cbf0 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2cc00 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2cc10 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2cc20 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2cc30 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2cc40 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2cc50 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2cc60 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2cc70 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2cc80 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2cc90 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2cca0 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2ccb0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2ccc0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2ccd0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2cce0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2ccf0 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2cd00 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2cd10 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2cd20 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2cd30 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2cd40 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2cd50 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2cd60 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2cd70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2cd80 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2cd90 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2cda0 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2cdb0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2cdc0 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2cdd0 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2cde0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2cdf0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2ce00 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2ce10 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2ce20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2ce30 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2ce40 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2ce50 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2ce60 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2ce70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2ce80 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2ce90 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2cea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2ceb0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2cec0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2ced0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2cee0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2cef0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2cf00 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2cf10 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2cf20 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2cf30 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2cf40 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2cf50 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2cf60 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2cf70 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2cf80 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2cf90 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2cfa0 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2cfb0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2cfc0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2cfd0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2cfe0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2cff0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2d000 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2d010 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2d020 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2d030 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2d040 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2d050 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2d060 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2d070 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2d080 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2d090 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2d0a0 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2d0b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d0c0 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2d0d0 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2d0e0 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2d0f0 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2d100 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2d110 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2d120 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2d130 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2d140 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2d150 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2d160 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2d170 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d180 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d190 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2d1a0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d1b0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d1c0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d1d0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d1e0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d1f0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d200 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2d210 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2d220 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2d230 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2d240 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2d250 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d260 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2d270 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2d280 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2d290 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2d2a0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2d2b0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2d2c0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2d2d0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2d2e0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2d2f0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2d300 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2d310 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d320 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d330 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d340 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d350 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d360 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d370 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2d380 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2d390 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2d3a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2d3b0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2d3c0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2d3d0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2d3e0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2d3f0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2d400 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2d410 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2d420 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2d430 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2d440 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2d450 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2d460 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2d470 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2d480 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2d490 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2d4a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2d4b0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2d4c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2d4d0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2d4e0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2d4f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2d500 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2d510 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2d520 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2d530 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2d540 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2d550 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2d560 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2d570 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2d580 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2d590 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2d5a0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2d5b0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2d5c0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
2d5d0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
2d5e0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
2d5f0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
2d600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2d610 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
2d620 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2d630 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
2d640 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2d650 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2d660 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2d670 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2d680 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
2d690 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
2d6a0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2d6b0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
2d6c0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2d6d0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
2d6e0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
2d6f0 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
2d700 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2d710 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d720 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
2d730 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2d740 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
2d750 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2d760 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2d770 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2d780 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
2d790 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2d7a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2d7b0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2d7c0 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2d7d0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2d7e0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2d7f0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2d800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2d810 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2d820 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2d830 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
2d840 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
2d850 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
2d860 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2d870 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
2d880 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
2d890 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2d8a0 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
2d8b0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2d8c0 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
2d8d0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
2d8e0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
2d8f0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
2d900 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
2d910 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2d920 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2d930 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
2d940 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
2d950 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
2d960 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
2d970 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2d980 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2d9a0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
2d9b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9d0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
2d9e0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2d9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2da00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2da10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da30 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
2da40 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
2da50 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2da60 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
2da70 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
2da80 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
2da90 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2dab0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
2dac0 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
2dad0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2dae0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2db00 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
2db10 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
2db20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2db30 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
2db40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
2db50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
2db60 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2db70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2db80 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2db90 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2dba0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2dbb0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2dbd0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
2dbe0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
2dbf0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
2dc00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2dc10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
2dc20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
2dc30 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
2dc40 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2dc50 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
2dc60 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
2dc80 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2dca0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
2dcb0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2dcc0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
2dcd0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
2dce0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2dcf0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
2dd00 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
2dd10 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
2dd20 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
2dd50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
2dd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2dd80 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dda0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ddb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2ddf0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2de00 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2de10 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2de20 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2de30 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
2de40 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
2de50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de70 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2de80 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
2de90 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
2dea0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
2deb0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
2dec0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
2ded0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
2dee0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
2def0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
2df00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
2df10 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
2df20 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
2df30 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
2df40 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
2df50 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
2df60 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
2df70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2df80 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
2df90 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2dfa0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2dfb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2dfc0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2dfd0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2dfe0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2dff0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
2e000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2e010 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2e020 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
2e030 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e040 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
2e050 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2e060 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
2e070 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
2e080 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
2e090 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e0a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2e0b0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
2e0c0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
2e0d0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
2e0e0 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
2e0f0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30  NC_InAggFunc)==0
2e100 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b  .       && pWalk
2e110 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d  er->walkerDepth=
2e120 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20  =pExpr->op2.    
2e130 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2e140 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2e150 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
2e160 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
2e170 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
2e180 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
2e190 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
2e1a0 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
2e1b0 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
2e1c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
2e1d0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2e1e0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
2e1f0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
2e200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2e210 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2e220 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2e230 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2e240 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2e250 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70   pItem->pExpr, p
2e260 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
2e270 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e280 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2e290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e2a0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
2e2b0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
2e2c0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
2e2d0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
2e2e0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2e2f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2e300 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
2e310 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
2e320 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
2e330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
2e340 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2e350 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2e360 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
2e370 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
2e380 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e390 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e3a0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
2e3b0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e3c0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2e3d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2e3e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
2e3f0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
2e400 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2e410 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
2e420 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e430 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2e440 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2e450 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
2e460 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2e470 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
2e480 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
2e490 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
2e4a0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2e4b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2e4c0 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2e4e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
2e4f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
2e500 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
2e510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2e520 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
2e530 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
2e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e550 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2e560 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2e570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2e580 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2e590 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2e5a0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2e5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e5c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e5d0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
2e5e0 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
2e5f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
2e600 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
2e610 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
2e620 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e630 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e640 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2e650 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2e660 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
2e670 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2e680 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
2e690 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
2e6a0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
2e6b0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2e6c0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2e6d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
2e6e0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2e6f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e700 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e710 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
2e720 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2e730 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2e740 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
2e750 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e760 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
2e770 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2e780 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2e790 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e7a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2e7b0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2e7c0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  ++;.  return WRC
2e7d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
2e7e0 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
2e7f0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2e800 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57  ctEnd(Walker *pW
2e810 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2e820 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2e830 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2e840 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2e850 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a  >walkerDepth--;.
2e860 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
2e870 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2e880 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
2e890 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
2e8a0 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
2e8b0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2e8c0 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
2e8d0 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
2e8e0 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
2e8f0 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
2e900 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
2e910 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
2e920 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
2e930 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
2e940 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
2e950 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2e960 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2e970 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
2e980 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
2e990 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
2e9a0 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
2e9b0 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
2e9c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e9d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
2e9e0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2e9f0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2ea00 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2ea10 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
2ea20 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
2ea30 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2ea40 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2ea50 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
2ea60 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2ea70 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41  back2 = analyzeA
2ea80 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ea90 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72  tEnd;.  w.walker
2eaa0 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75  Depth = 0;.  w.u
2eab0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
2eac0 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
2ead0 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
2eae0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2eaf0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
2eb00 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
2eb10 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2eb20 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
2eb30 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
2eb40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
2eb50 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
2eb60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2eb70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2eb80 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
2eb90 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
2eba0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
2ebb0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ebc0 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
2ebd0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2ebe0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2ebf0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2ec00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2ec10 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
2ec20 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
2ec30 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
2ec40 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2ec50 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
2ec60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ec70 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2ec80 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
2ec90 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
2eca0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2ecb0 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
2ecc0 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
2ecd0 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
2ece0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
2ecf0 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
2ed00 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
2ed10 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2ed20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
2ed30 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
2ed40 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
2ed50 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
2ed60 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
2ed70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
2ed80 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
2ed90 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
2eda0 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
2edb0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2edc0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
2edd0 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
2ede0 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
2edf0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
2ee00 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
2ee10 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
2ee20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
2ee30 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
2ee40 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
2ee50 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
2ee60 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
2ee70 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
2ee80 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
2ee90 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2eea0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2eeb0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2eec0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2eed0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2eee0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2eef0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2ef00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2ef10 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
2ef20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
2ef30 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
2ef40 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
2ef50 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
2ef60 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
2ef70 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
2ef80 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
2ef90 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
2efa0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2efb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2efc0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
2efd0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
2efe0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2eff0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
2f000 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
2f010 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
2f020 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
2f030 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2f040 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2f050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f060 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2f070 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d   n;.  if( nReg==
2f080 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
2f090 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2f0a0 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72  rse);.  i = pPar
2f0b0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2f0c0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2f0d0 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2f0e0 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
2f0f0 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
2f100 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
2f110 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
2f120 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2f130 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
2f140 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f150 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
2f160 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
2f170 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2f180 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2f190 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
2f1a0 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
2f1b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2f1c0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2f1d0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
2f1e0 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
2f1f0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  Reg==1 ){.    sq
2f200 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f210 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67  Reg(pParse, iReg
2f220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2f230 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2f240 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
2f250 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
2f260 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
2f270 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
2f280 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2f290 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
2f2a0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2f2b0 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
2f2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2f2d0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
2f2e0 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
2f2f0 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
2f300 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
2f310 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2f320 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
2f330 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
2f340 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
2f350 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2f360 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
2f370 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20  * Validate that 
2f380 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  no temporary reg
2f390 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68  ister falls with
2f3a0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  in the range of.
2f3b0 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ** iFirst..iLast
2f3c0 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68  , inclusive.  Th
2f3d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2f3e0 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74  ly call from wit
2f3f0 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  hin assert().** 
2f400 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
2f410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2f420 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  UG.int sqlite3No
2f430 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72  TempsInRange(Par
2f440 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2f450 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73  iFirst, int iLas
2f460 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
2f470 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  f( pParse->nRang
2f480 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61  eReg>0.   && pPa
2f490 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70  rse->iRangeReg+p
2f4a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2f4b0 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20   > iFirst.   && 
2f4c0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2f4d0 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a  g <= iLast.  ){.
2f4e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2f4f0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2f500 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2f510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2f520 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2f530 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2f540 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2f550 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2f560 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2f570 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f580 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2f590 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.