/ Hex Artifact Content
Login

Artifact 4bc508644845d2c9fb870e808df125b233a8d93d132c2184f8db0a034864325a:


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 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  f;.        pNew-
66b0: 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c  >u.iValue = iVal
66c0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
66d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66e0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
66f0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
6700: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
6710: 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65  n->z!=0 || pToke
6720: 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  n->n==0 );.     
6730: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
6740: 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e   ) memcpy(pNew->
6750: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
6760: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
6770: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
6780: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
6790: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
67a0: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 73  if( dequote && s
67b0: 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e  qlite3Isquote(pN
67c0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29  ew->u.zToken[0])
67d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
67e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
67f0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
6800: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6810: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
6820: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
6830: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6840: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6850: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6860: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6870: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6880: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6890: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
68a0: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
68b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
68c0: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
68d0: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
68e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
68f0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6900: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6910: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6920: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6930: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6950: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6970: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6980: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6990: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
69a0: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
69b0: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
69d0: 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  30(zToken);.  re
69e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
69f0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
6a00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
6a10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
6a20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
6a30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
6a40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
6a50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
6a60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
6a70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6a80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
6a90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
6aa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
6ab0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6ac0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
6ad0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
6ae0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
6af0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
6b00: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
6b10: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
6b20: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
6b30: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
6b40: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6b70: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
6b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6b90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6ba0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6bb0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
6bc0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
6bd0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6bf0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6c00: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
6c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6c20: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
6c30: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
6c40: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
6c50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6c60: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
6c70: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6c80: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6c90: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
6ca0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6cb0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
6cc0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
6cd0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
6ce0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
6cf0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
6d00: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
6d10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d20: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
6d30: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
6d40: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
6d50: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
6d60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6d70: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
6d80: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
6d90: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
6da0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
6db0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6dd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6de0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6e00: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6e10: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
6e20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
6e30: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
6e40: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
6e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
6e60: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29  ght operand */.)
6e70: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
6e80: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
6e90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
6ea0: 20 26 26 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f   && !IN_RENAME_O
6eb0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 2f 2a 20  BJECT ){.    /* 
6ec0: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6ed0: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6ee0: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6ef0: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f10: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f20: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6f30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6f40: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6f50: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6f60: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6f70: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6f80: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
6f90: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fa0: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
6fb0: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
6fc0: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
6fd0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
6fe0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6ff0: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7000: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7010: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7020: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
7030: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
7040: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
7050: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
7060: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7070: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
7080: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7090: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
70a0: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
70b0: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
70c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
70d0: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
70e0: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
70f0: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7100: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7110: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7120: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
7130: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
7140: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
7150: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
7160: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
7170: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
7180: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7190: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
71a0: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
71b0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
71c0: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
71d0: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
71e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
71f0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7200: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7210: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7220: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
7230: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
7240: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
7250: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
7260: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
7270: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
7280: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7290: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
72a0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
72b0: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
72c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
72d0: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
72e0: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
72f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7300: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7310: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7320: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
7330: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
7340: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
7350: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
7360: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
7370: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
7380: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7390: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
73a0: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
73b0: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
73c0: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
73d0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
73e0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
73f0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7400: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7410: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7420: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
7430: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
7440: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
7450: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
7460: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
7470: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
7480: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7490: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
74a0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
74b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
74c0: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
74d0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
74e0: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
74f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7500: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7510: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7520: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
7530: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
7540: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
7550: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
7560: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
7570: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7580: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7590: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
75a0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
75b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
75c0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
75d0: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
75e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
75f0: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7600: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7610: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7620: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
7630: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
7640: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
7650: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
7660: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
7670: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
7680: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7690: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
76a0: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
76b0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
76c0: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
76d0: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
76e0: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
76f0: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7700: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7710: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7720: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
7730: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
7740: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
7750: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
7760: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
7770: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7780: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7790: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
77a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
77b0: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
77c0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
77d0: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
77e0: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
77f0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7800: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7810: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7820: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7830: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7840: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7850: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
7860: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
7870: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
7880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7890: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
78a0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
78b0: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
78c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
78d0: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
78e0: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
78f0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7900: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7910: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7920: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
7930: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
7940: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
7950: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
7960: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
7970: 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50  xprFunction(.  P
7980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7990: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
79a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
79b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
79c0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c     /* Argument l
79d0: 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
79e0: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
79f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7a00: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
7a10: 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  eDistinct       
7a20: 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74    /* SF_Distinct
7a30: 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20   or SF_ALL or 0 
7a40: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
7a50: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
7a60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7a70: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7a80: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
7a90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7aa0: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
7ab0: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
7ac0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
7ad0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7ae0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
7af0: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
7b00: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
7b10: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
7b20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7b30: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
7b40: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72  st->nExpr > pPar
7b50: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
7b60: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7b70: 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20  TION_ARG] ){.   
7b80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7b90: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
7ba0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
7bb0: 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54  function %T", pT
7bc0: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  oken);.  }.  pNe
7bd0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7be0: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7bf0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7c00: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7c10: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7c20: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7c30: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7c40: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7c50: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7c60: 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65  , pNew);.  if( e
7c70: 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73  Distinct==SF_Dis
7c80: 74 69 6e 63 74 20 29 20 45 78 70 72 53 65 74 50  tinct ) ExprSetP
7c90: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7ca0: 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65  _Distinct);.  re
7cb0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7cc0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
7cd0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
7ce0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
7cf0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
7d00: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
7d10: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
7d20: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
7d30: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
7d40: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
7d50: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
7d60: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
7d70: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
7d80: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
7d90: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
7da0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
7db0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
7dc0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
7dd0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
7de0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69  n" is not too bi
7df0: 67 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  g to avoid a den
7e00: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
7e10: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
7e20: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7e30: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
7e40: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
7e50: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7e60: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
7e70: 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24  ", "@aaa", or "$
7e80: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
7e90: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
7ea0: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
7eb0: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
7ec0: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
7ed0: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
7ee0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7ef0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7f00: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
7f10: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61  xt sequential va
7f20: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
7f30: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
7f40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
7f50: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
7f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7f70: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32  Expr *pExpr, u32
7f80: 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a   n){.  sqlite3 *
7f90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7fa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7fb0: 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20  ;.  ynVar x;..  
7fc0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7fd0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fe0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7ff0: 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
8000: 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c  alue|EP_Reduced|
8010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b  EP_TokenOnly) );
8020: 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  .  z = pExpr->u.
8030: 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  zToken;.  assert
8040: 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( z!=0 );.  asse
8050: 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  rt( z[0]!=0 );. 
8060: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32   assert( n==(u32
8070: 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  )sqlite3Strlen30
8080: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
8090: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
80a0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
80b0: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
80c0: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
80d0: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
80e0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
80f0: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
8100: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8110: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
8120: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
8130: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
8140: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
8150: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
8160: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
8170: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
8180: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
8190: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
81a0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
81b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
81c0: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
81d0: 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  bOk;.      if( n
81e0: 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==2 ){ /*OPTIMIZ
81f0: 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
8200: 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d          i = z[1]
8210: 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f  -'0';  /* The co
8220: 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20  mmon case of ?N 
8230: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67  for a single dig
8240: 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  it N */.        
8250: 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
8260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f  else{.        bO
8270: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
8280: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
8290: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
82a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
82b0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
82c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
82d0: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
82e0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
82f0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8300: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8310: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
8320: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
8330: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8340: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8350: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
8360: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
8370: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
8380: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8390: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
83a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
83b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
83c0: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
83d0: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
83e0: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
83f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
8400: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8410: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8420: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
8430: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8440: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8450: 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78  r)i;.      if( x
8460: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
8470: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8480: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a  >nVar = (int)x;.
8490: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
84a0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
84b0: 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  f( sqlite3VListN
84c0: 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
84d0: 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29  >pVList, x)==0 )
84e0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  {.        doAdd 
84f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8510: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
8520: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
8530: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
8540: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
8550: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
8560: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
8570: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
8580: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
8590: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
85a0: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
85b0: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
85c0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
85d0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
85e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20       */.      x 
85f0: 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33  = (ynVar)sqlite3
8600: 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70  VListNameToNum(p
8610: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
8620: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
8630: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
8640: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8650: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
8660: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
8670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8680: 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20    if( doAdd ){. 
8690: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
86a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69  ist = sqlite3VLi
86b0: 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65  stAdd(db, pParse
86c0: 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20  ->pVList, z, n, 
86d0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
86e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
86f0: 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e   x;.  if( x>db->
8700: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8710: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8720: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
8730: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8740: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
8750: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
8760: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
8770: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
8780: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8790: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
87a0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
87b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
87c0: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
87d0: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  b, Expr *p){.  a
87e0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
87f0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
8800: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
8810: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
8820: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
8830: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
8840: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8850: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
8860: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
8870: 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73  alue>=0 );..  as
8880: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8890: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
88a0: 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57  Func) || p->y.pW
88b0: 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  in!=0 || db->mal
88c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
88d0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
88e0: 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70  _FUNCTION || Exp
88f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8900: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8910: 52 65 64 75 63 65 64 29 0a 20 20 20 20 20 20 20  Reduced).       
8920: 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d     || p->y.pWin=
8930: 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
8940: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
8950: 75 6e 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53  unc) );.#ifdef S
8960: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
8970: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8980: 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26  y(p, EP_Leaf) &&
8990: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
89a0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
89b0: 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  y) ){.    assert
89c0: 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  ( p->pLeft==0 );
89d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89e0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
89f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53   assert( p->x.pS
8a00: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a  elect==0 );.  }.
8a10: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78  #endif.  if( !Ex
8a20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8a30: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
8a40: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
8a50: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
8a60: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
8a70: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
8a80: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
8a90: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
8aa0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
8ab0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8ac0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8ad0: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8ae0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8b00: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8b10: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  );.    if( p->pR
8b20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
8b30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8b40: 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  N(db, p->pRight)
8b50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8b60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8b70: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
8b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b90: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8ba0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8bb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8bd0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8be0: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8bf0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
8c00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
8c10: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 61  Func) ){.      a
8c20: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
8c30: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8c40: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8c50: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79 2e  Delete(db, p->y.
8c60: 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pWin);.    }.  }
8c70: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8c80: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
8c90: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
8ca0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
8cb0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  zToken);.  if( !
8cc0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8cd0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
8ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8cf0: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d  eeNN(db, p);.  }
8d00: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
8d10: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
8d20: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
8d30: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
8d40: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8d50: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
8d60: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8d70: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
8d80: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
8d90: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
8da0: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
8db0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
8dc0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
8dd0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
8de0: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
8df0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
8e00: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8e10: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
8e20: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
8e30: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
8e40: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8e50: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8e60: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8e70: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
8e80: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8e90: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
8ea0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
8eb0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
8ec0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
8ed0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
8ee0: 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
8ef0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
8f00: 45 78 70 72 20 6e 6f 64 65 2c 20 74 61 6b 69 6e  Expr node, takin
8f10: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
8f20: 61 64 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65  ad.** past the e
8f30: 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
8f40: 75 72 65 20 66 6f 72 20 61 20 72 65 64 75 63 65  ure for a reduce
8f50: 64 2d 73 69 7a 65 20 76 65 72 73 69 6f 6e 20 6f  d-size version o
8f60: 66 20 74 68 65 20 73 6f 75 72 63 65 0a 2a 2a 20  f the source.** 
8f70: 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Expr..*/.static 
8f80: 76 6f 69 64 20 65 78 70 72 4e 6f 64 65 43 6f 70  void exprNodeCop
8f90: 79 28 45 78 70 72 20 2a 70 44 65 73 74 2c 20 45  y(Expr *pDest, E
8fa0: 78 70 72 20 2a 70 53 72 63 29 7b 0a 20 20 6d 65  xpr *pSrc){.  me
8fb0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 73  mset(pDest, 0, s
8fc0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
8fd0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2c 20 70 53  memcpy(pDest, pS
8fe0: 72 63 2c 20 65 78 70 72 53 74 72 75 63 74 53 69  rc, exprStructSi
8ff0: 7a 65 28 70 53 72 63 29 29 3b 0a 7d 0a 0a 2f 2a  ze(pSrc));.}../*
9000: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
9010: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
9020: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
9030: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9040: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
9050: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
9060: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
9070: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
9080: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
9090: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
90a0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
90b0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
90c0: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
90d0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
90e0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
90f0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
9100: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
9110: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
9120: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
9130: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
9140: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
9150: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
9160: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
9170: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
9180: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
91d0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
91e0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
91f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9200: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
9210: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
9220: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
9230: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
9240: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
9250: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
9260: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
9270: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
9280: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
9290: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
92a0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
92b0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
92c0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
92d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
92e0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
92f0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
9300: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
9310: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
9320: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
9330: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
9340: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
9350: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
9360: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
9370: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
9380: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
9390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
93a0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
93b0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
93c0: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
93d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
93e0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
93f0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
9400: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
9410: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9420: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
9430: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
9440: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
9450: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
9460: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
9470: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
9480: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
9490: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
94a0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
94b0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
94c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
94d0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
94e0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
94f0: 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63  f the Expr objec
9500: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
9510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
9520: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
9530: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
9540: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
9550: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
9560: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
9570: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
9580: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
9590: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
95a0: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
95b0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
95c0: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
95d0: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
95e0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
95f0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
9600: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
9610: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
9620: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
9630: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
9640: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
9650: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
9660: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
9670: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
9680: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9690: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
96a0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
96b0: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
96c0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
96d0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
96e0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
96f0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
9700: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
9710: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
9720: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
9730: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
9740: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
9750: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
9760: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
9770: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9780: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9790: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
97a0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
97b0: 0a 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72  .   || ExprHasPr
97c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
97d0: 46 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29  Func).#endif.  )
97e0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
97f0: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d  PR_FULLSIZE;.  }
9800: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9810: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9820: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
9830: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
9840: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9850: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9860: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
9870: 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ; .    assert( !
9880: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9890: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
98a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
98b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
98c0: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20  p, EP_NoReduce) 
98d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
98e0: 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73  eft || p->x.pLis
98f0: 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  t ){.      nSize
9900: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
9910: 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64  IZE | EP_Reduced
9920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9940: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
9950: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f   nSize = EXPR_TO
9960: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
9970: 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
9980: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9990: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
99a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
99b0: 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69  urns the space i
99c0: 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  n bytes required
99d0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
99e0: 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78  py .** of the Ex
99f0: 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  pr structure and
9a00: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9a10: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72  xpr.u.zToken str
9a20: 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20  ing (if that.** 
9a30: 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65  string is define
9a40: 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d.).*/.static in
9a50: 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  t dupedExprNodeS
9a60: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9a70: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9a80: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9a90: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c  StructSize(p, fl
9aa0: 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20  ags) & 0xfff;.  
9ab0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
9ac0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
9ad0: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
9ae0: 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ken ){.    nByte
9af0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
9b00: 6e 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65  n30NN(p->u.zToke
9b10: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
9b20: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
9b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b40: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9b50: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9b60: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
9b70: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
9b80: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
9b90: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
9ba0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
9bb0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
9bc0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9bd0: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9be0: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
9bf0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9c00: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
9c10: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
9c20: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9c30: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
9c40: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9c50: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9c60: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
9c70: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
9c80: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
9c90: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
9ca0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9cb0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
9cc0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9cd0: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9ce0: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
9cf0: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
9d00: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
9d10: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
9d20: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
9d30: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
9d40: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9d50: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9d60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
9d70: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
9d80: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
9d90: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9da0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
9db0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9dc0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9de0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
9df0: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
9e00: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
9e10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9e20: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9e30: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9e40: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9e50: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9e60: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
9e70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9e80: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
9e90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9ea0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
9eb0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
9ec0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9ed0: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9ee0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
9ef0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
9f00: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
9f10: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
9f20: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
9f30: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
9f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9f50: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9f60: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
9f70: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
9f80: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
9f90: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
9fa0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
9fb0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
9fc0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9fd0: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9fe0: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
9ff0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
a000: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
a010: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
a020: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
a030: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a040: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
a050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
a060: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
a070: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
a080: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
a090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
a0a0: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
a0b0: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
a0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
a0d0: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
a0e0: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
a0f0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
a100: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
a110: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
a120: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
a130: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
a140: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
a150: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
a160: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
a170: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
a180: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
a190: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
a1a0: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
a1b0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
a1c0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
a1d0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
a1e0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
a1f0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
a200: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
a210: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a220: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
a230: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
a240: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
a250: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
a260: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
a270: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
a280: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
a290: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
a2a0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
a2b0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
a2c0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
a2d0: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
a2e0: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
a2f0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
a300: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
a310: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
a320: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
a330: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
a340: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
a350: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
a360: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
a370: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
a380: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
a390: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
a3a0: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
a3b0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
a3c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
a3d0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
a3e0: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
a3f0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
a400: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
a410: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
a420: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
a430: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
a440: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
a450: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
a460: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
a470: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
a480: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a490: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
a4a0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
a4b0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
a4c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
a4d0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
a4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
a4f0: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
a500: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
a510: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a520: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a530: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
a540: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
a550: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
a560: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
a570: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
a580: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
a590: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
a5a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
a5b0: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
a5c0: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
a5d0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
a5e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a5f0: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
a600: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
a610: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
a620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
a630: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
a640: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
a650: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
a660: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
a670: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
a680: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
a690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a6a0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
a6b0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
a6c0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
a6d0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
a6e0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a6f0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
a700: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
a710: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
a720: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
a730: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
a740: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
a750: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
a760: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
a770: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
a780: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
a790: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
a7a0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
a7b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
a7c0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a7d0: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a7e0: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a7f0: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a800: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a810: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a820: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a830: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a840: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a850: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a860: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a870: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a880: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a890: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a8a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a8b0: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a8c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a8d0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a8e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a8f0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a900: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a910: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a920: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a930: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a940: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a950: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a960: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a970: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a980: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e  TokenOnly|EP_Win
a990: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a  Func) ){.      z
a9a0: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a9b0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a9c0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a9d0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a9e0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a9f0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
aa10: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
aa20: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
aa30: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
aa40: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
aa50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
aa60: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
aa70: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
aa80: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
aa90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aaa0: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
aab0: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
aac0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
aad0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
aae0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
aaf0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
ab00: 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78  UNC.      if( Ex
ab10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ab20: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
ab30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e          pNew->y.
ab40: 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69  pWin = sqlite3Wi
ab50: 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77  ndowDup(db, pNew
ab60: 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20  , p->y.pWin);.  
ab70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
ab80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
ab90: 65 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  ew, EP_WinFunc) 
aba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
abb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
abc0: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
abd0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
abe0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  r ){.        *pz
abf0: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
ac00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ac10: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45  se{.      if( !E
ac20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ac30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
ac40: 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  P_Leaf) ){.     
ac50: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
ac60: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
ac70: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
ac80: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
ac90: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
aca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c   assert( p->iCol
acb0: 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  umn==0 || p->pRi
acc0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
acd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ace0: 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e  Right==0  || p->
acf0: 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74  pRight==p->pLeft
ad00: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
ad10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
ad20: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
ad30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ad40: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
ad50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
ad60: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
ad70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ad80: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
ad90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ada0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
adb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
adc0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
add0: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
ade0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
adf0: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
ae00: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
ae10: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
ae20: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
ae30: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
ae40: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
ae50: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
ae60: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
ae70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
ae80: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
ae90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
aea0: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
aeb0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
aec0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
aed0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
aee0: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
aef0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
af00: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
af10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
af20: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
af30: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
af40: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
af50: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
af60: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
af70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
af80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
af90: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
afa0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
afb0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
afc0: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
afd0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
afe0: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
aff0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
b000: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
b010: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
b020: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
b030: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b040: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
b050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
b070: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
b080: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
b090: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   0.#endif..#ifnd
b0a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
b0b0: 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  INDOWFUNC./*.** 
b0c0: 54 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74  The gatherSelect
b0d0: 57 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64  Windows() proced
b0e0: 75 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70  ure and its help
b0f0: 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61  er routine.** ga
b100: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b110: 73 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20  sCallback() are 
b120: 75 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c  used to scan all
b130: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
b140: 0a 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64  .** an a newly d
b150: 75 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54  uplicated SELECT
b160: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67   statement and g
b170: 61 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  ather all of the
b180: 20 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63   Window.** objec
b190: 74 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20  ts found there, 
b1a0: 61 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20  assembling them 
b1b0: 6f 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  onto the linked 
b1c0: 6c 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e  list at Select->
b1d0: 70 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pWin..*/.static 
b1e0: 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74  int gatherSelect
b1f0: 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28  WindowsCallback(
b200: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
b210: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
b220: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b230: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
b240: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20  Expr->y.pWin!=0 
b250: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45  ){.    assert( E
b260: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b270: 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
b280: 29 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ) );.    pExpr->
b290: 79 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  y.pWin->pNextWin
b2a0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
b2b0: 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20  elect->pWin;.   
b2c0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
b2d0: 65 63 74 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70  ect->pWin = pExp
b2e0: 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20  r->y.pWin;.  }. 
b2f0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
b300: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
b310: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b320: 69 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c  indowsSelectCall
b330: 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61  back(Walker *pWa
b340: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
b350: 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70 57  {.  return p==pW
b360: 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
b370: 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20   ? WRC_Continue 
b380: 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73  : WRC_Prune;.}.s
b390: 74 61 74 69 63 20 76 6f 69 64 20 67 61 74 68 65  tatic void gathe
b3a0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 53  rSelectWindows(S
b3b0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c  elect *p){.  Wal
b3c0: 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
b3d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b3e0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61  rSelectWindowsCa
b3f0: 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c  llback;.  w.xSel
b400: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61  ectCallback = ga
b410: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b420: 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b  sSelectCallback;
b430: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b440: 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75  back2 = 0;.  w.u
b450: 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  .pSelect = p;.  
b460: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
b470: 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64  t(&w, p);.}.#end
b480: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
b490: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
b4a0: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
b4b0: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
b4c0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
b4d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
b4e0: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
b4f0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
b500: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
b510: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
b520: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
b530: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
b540: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
b550: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
b560: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
b570: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
b580: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
b590: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
b5a0: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
b5b0: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
b5c0: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
b5d0: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
b5e0: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
b5f0: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
b600: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
b610: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
b620: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
b630: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
b640: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
b650: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
b660: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
b670: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
b680: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
b690: 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  icated..**.** Th
b6a0: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b6b0: 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d  r contains a com
b6c0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
b6d0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
b6e0: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  s..** If the EXP
b6f0: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
b700: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
b710: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
b720: 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75  rned is a.** tru
b730: 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  ncated version o
b740: 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72  f the usual Expr
b750: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b760: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  will be stored a
b770: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  s.** part of the
b780: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
b790: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b7a0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
b7b0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
b7c0: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
b7d0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
b7e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
b7f0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
b800: 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  | flags==EXPRDUP
b810: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74  _REDUCE );.  ret
b820: 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28  urn p ? exprDup(
b830: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
b840: 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74   : 0;.}.ExprList
b850: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
b860: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b870: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
b880: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
b890: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
b8a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b8b0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
b8c0: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
b8d0: 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65    Expr *pPriorSe
b8e0: 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61  lectCol = 0;.  a
b8f0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b900: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b910: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
b920: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b930: 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33  awNN(db, sqlite3
b940: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
b950: 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77   p));.  if( pNew
b960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b970: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
b980: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65  p->nExpr;.  pIte
b990: 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70  m = pNew->a;.  p
b9a0: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
b9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b9c0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
b9d0: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
b9e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
b9f0: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
ba00: 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  >pExpr;.    Expr
ba10: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
ba20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
ba30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ba40: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
ba50: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  s);.    if( pOld
ba60: 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f  Expr .     && pO
ba70: 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  ldExpr->op==TK_S
ba80: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20  ELECT_COLUMN.   
ba90: 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d    && (pNewExpr =
baa0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d   pItem->pExpr)!=
bab0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
bac0: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
bad0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
bae0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  i>0 );.      if(
baf0: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
bb00: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
bb10: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70   assert( pOldExp
bb20: 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78  r->pLeft==pOldEx
bb30: 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20  pr->pRight );.  
bb40: 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65        pPriorSele
bb50: 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72  ctCol = pNewExpr
bb60: 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78  ->pLeft = pNewEx
bb70: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
bb80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bb90: 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
bba0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bbb0: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21  pItem[-1].pExpr!
bbc0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
bbd0: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e  sert( pNewExpr->
bbe0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d  iColumn==pItem[-
bbf0: 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  1].pExpr->iColum
bc00: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  n+1 );.        a
bc10: 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c  ssert( pPriorSel
bc20: 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31  ectCol==pItem[-1
bc30: 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ].pExpr->pLeft )
bc40: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78  ;.        pNewEx
bc50: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69  pr->pLeft = pPri
bc60: 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20  orSelectCol;.   
bc70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bc80: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
bc90: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
bca0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
bcb0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
bcc0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
bcd0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bce0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
bcf0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
bd00: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
bd10: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
bd20: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
bd30: 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73    pItem->bSpanIs
bd40: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
bd50: 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20  bSpanIsTab;.    
bd60: 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
bd70: 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  f = pOldItem->bS
bd80: 6f 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49  orterRef;.    pI
bd90: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
bda0: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
bdb0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
bdc0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
bdd0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
bde0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
bdf0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
be00: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
be10: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
be20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
be30: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
be40: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
be50: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
be60: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
be70: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
be80: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
be90: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
bea0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
beb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bec0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
bed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bee0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
bef0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
bf10: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
bf20: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
bf30: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
bf40: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
bf50: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
bf60: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
bf70: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
bf80: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bf90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bfa0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
bfb0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
bfc0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
bfd0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
bfe0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
bff0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c000: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
c010: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
c020: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c030: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
c040: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
c050: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
c060: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
c070: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
c080: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
c090: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
c0a0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
c0b0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
c0c0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
c0d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
c0e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
c0f0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
c100: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c110: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
c120: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
c130: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c140: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
c150: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
c160: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
c170: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c180: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
c190: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
c1a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c1b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c1c0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
c1d0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
c1e0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
c1f0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
c200: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
c210: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
c220: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
c230: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
c240: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
c250: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
c260: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
c270: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
c280: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
c290: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
c2a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
c2b0: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
c2c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c2d0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
c2e0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
c2f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
c300: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
c310: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
c320: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
c330: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
c340: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c350: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
c360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c370: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
c380: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
c390: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
c3a0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
c3b0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
c3c0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
c3d0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
c3e0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
c3f0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
c400: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
c410: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
c420: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
c430: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
c440: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
c450: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
c460: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
c470: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
c480: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c490: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
c4a0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
c4b0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
c4c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
c4d0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
c4e0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
c4f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c500: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
c510: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
c520: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
c530: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
c540: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
c550: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c560: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c570: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
c580: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c590: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c5a0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
c5b0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
c5c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
c5d0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
c5e0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c5f0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
c600: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
c610: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
c620: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
c630: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
c640: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
c650: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
c660: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
c670: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
c680: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
c690: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
c6a0: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
c6b0: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
c6c0: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
c6d0: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
c6e0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
c6f0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
c700: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
c710: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
c720: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
c730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c740: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c750: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
c760: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
c770: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c780: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
c790: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
c7a0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
c7b0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c7c0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
c7d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
c7e0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
c7f0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
c800: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
c810: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c820: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c830: 65 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74  elect *pDup, int
c840: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
c850: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53  t *pRet = 0;.  S
c860: 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30  elect *pNext = 0
c870: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20  ;.  Select **pp 
c880: 3d 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63  = &pRet;.  Selec
c890: 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  t *p;..  assert(
c8a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28   db!=0 );.  for(
c8b0: 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  p=pDup; p; p=p->
c8c0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
c8d0: 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ect *pNew = sqli
c8e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c8f0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
c900: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c910: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c920: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
c930: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c940: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
c950: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c960: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
c970: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
c980: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
c990: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  .    pNew->pWher
c9a0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
c9b0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
c9c0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c9d0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
c9e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c9f0: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
ca00: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
ca10: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
ca20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ca30: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
ca40: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
ca50: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
ca60: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ca70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
ca80: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
ca90: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20  >op = p->op;.   
caa0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
cab0: 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Next;.    pNew->
cac0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cad0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
cae0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
caf0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
cb00: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
cb10: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
cb20: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
cb30: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
cb40: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
cb50: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
cb60: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
cb70: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
cb80: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cb90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
cba0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cbb0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
cbc0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
cbd0: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
cbe0: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
cbf0: 57 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53  With);.#ifndef S
cc00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cc10: 57 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e  WFUNC.    pNew->
cc20: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e  pWin = 0;.    pN
cc30: 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73  ew->pWinDefn = s
cc40: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
cc50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44  Dup(db, p->pWinD
cc60: 65 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  efn);.    if( p-
cc70: 3e 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65  >pWin ) gatherSe
cc80: 6c 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77  lectWindows(pNew
cc90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e  );.#endif.    pN
cca0: 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73  ew->selId = p->s
ccb0: 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20  elId;.    *pp = 
ccc0: 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26  pNew;.    pp = &
ccd0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pNew->pPrior;.  
cce0: 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a    pNext = pNew;.
ccf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
cd00: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  et;.}.#else.Sele
cd10: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
cd20: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
cd30: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
cd40: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
cd50: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
cd60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
cd70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
cd80: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
cd90: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
cda0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
cdb0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
cdc0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
cdd0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
cde0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
cdf0: 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61  *.** The pList a
ce00: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
ce10: 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
ce20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45   pointer to an E
ce30: 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69  xprList.** obtai
ce40: 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ned from a prior
ce50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ce60: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29  ExprListAppend()
ce70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
ce80: 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ** may not be us
ce90: 65 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c  ed with an ExprL
cea0: 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ist obtained fro
ceb0: 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  m sqlite3ExprLis
cec0: 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f  tDup()..** Reaso
ced0: 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n:  This routine
cee0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
cef0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  e number of slot
cf00: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a  s in pList->a[].
cf10: 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ** is a power of
cf20: 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74   two.  That is t
cf30: 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45  rue for sqlite3E
cf40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20  xprListAppend() 
cf50: 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69  returns.** but i
cf60: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
cf70: 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20  y true from the 
cf80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
cf90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cfa0: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  up()..**.** If a
cfb0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
cfc0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
cfd0: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
cfe0: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
cff0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d000: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
d010: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
d020: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
d030: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
d040: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
d050: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
d060: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
d070: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
d080: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
d090: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d0a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d0b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d0c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d0d0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d0e0: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
d0f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d100: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
d120: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
d130: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
d140: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  NULL */.){.  str
d150: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d160: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
d170: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d180: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d190: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
d1a0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
d1b0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
d1c0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
d1d0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
d1e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
d1f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
d200: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d210: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
d220: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  r = 0;.  }else i
d230: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
d240: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
d250: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  -1))==0 ){.    E
d260: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
d270: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
d280: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
d290: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  List, .         
d2a0: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
d2b0: 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78  t)+(2*pList->nEx
d2c0: 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  pr - 1)*sizeof(p
d2d0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
d2e0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
d2f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
d300: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
d310: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
d320: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d330: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d340: 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ++];.  assert( o
d350: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d360: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
d370: 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65  me)==sizeof(pIte
d380: 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61  m->pExpr) );.  a
d390: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d3a0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d3b0: 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29  item,pExpr)==0 )
d3c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65  ;.  memset(&pIte
d3d0: 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f  m->zName,0,sizeo
d3e0: 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74  f(*pItem)-offset
d3f0: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d400: 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b  st_item,zName));
d410: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
d420: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
d430: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
d440: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
d450: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
d460: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
d470: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
d480: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d490: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
d4a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d4b0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
d4c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d4d0: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
d4e0: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
d4f0: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
d500: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
d510: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
d520: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
d530: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
d540: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
d550: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
d560: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
d570: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
d580: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
d590: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
d5a0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
d5b0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
d5c0: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
d5d0: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
d5e0: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
d5f0: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
d600: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
d610: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
d620: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
d630: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
d640: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
d650: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
d660: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d670: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
d680: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d690: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d6a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d6b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d6c0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
d6d0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
d6e0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d6f0: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
d700: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
d710: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
d720: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
d730: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d740: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
d750: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
d760: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
d770: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
d780: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d790: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d7a0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
d7b0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
d7c0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
d7d0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
d7e0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
d7f0: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
d800: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
d810: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
d820: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
d830: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
d840: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
d850: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
d860: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
d870: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d880: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d890: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
d8a0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d8b0: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
d8c0: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
d8d0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
d8e0: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
d8f0: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
d900: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
d910: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
d920: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
d930: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
d940: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
d950: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
d960: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d970: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
d980: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
d990: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
d9a0: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
d9b0: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
d9c0: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
d9d0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
d9e0: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
d9f0: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
da00: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
da10: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
da20: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
da30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
da40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
da50: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
da60: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
da70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da80: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
da90: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
daa0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
dab0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
dac0: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
dad0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
dae0: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
daf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
db00: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
db10: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
db20: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
db30: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
db40: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
db50: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
db60: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
db70: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
db80: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
db90: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
dba0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
dbb0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
dbc0: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
dbd0: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
dbe0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
dbf0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
dc00: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
dc10: 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e  ailed && pExpr->
dc20: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
dc30: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30   ALWAYS(pList!=0
dc40: 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ) ){.    Expr *p
dc50: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
dc60: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
dc70: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
dc80: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
dc90: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
dca0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
dcb0: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
dcc0: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
dcd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
dce0: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
dcf0: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
dd00: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
dd10: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
dd20: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
dd30: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
dd40: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
dd50: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
dd60: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
dd70: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
dd80: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
dd90: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
dda0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
ddb0: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
ddc0: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
ddd0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
dde0: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
ddf0: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
de00: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
de10: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
de20: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
de30: 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
de40: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
de50: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
de60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
de70: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
de80: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
de90: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
dea0: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
deb0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
dec0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
ded0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
dee0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
def0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
df00: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
df10: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
df20: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
df30: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
df40: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
df50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
df60: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
df70: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
df80: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
df90: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
dfa0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
dfb0: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
dfc0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
dfd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dfe0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
dff0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
e000: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
e010: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
e020: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
e030: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
e040: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
e050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e060: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
e070: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e080: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e090: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e0a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e0b0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e0c0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e0d0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e0e0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
e0f0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e100: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e110: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e120: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e130: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e140: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e150: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e160: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
e170: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
e180: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e190: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e1a0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e1b0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e1c0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e1d0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e1e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
e1f0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
e200: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
e210: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
e220: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
e230: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
e240: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
e250: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
e260: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
e270: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
e280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
e290: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
e2a0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
e2b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e2c0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
e2d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e2e0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
e2f0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
e300: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
e310: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
e320: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
e330: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
e340: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
e350: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
e360: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
e370: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
e380: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
e390: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e3a0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
e3b0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
e3c0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
e3d0: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
e3e0: 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  d*)pItem->zName,
e3f0: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
e400: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
e410: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
e420: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
e430: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
e440: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
e450: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
e460: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
e470: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
e480: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
e490: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
e4a0: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
e4b0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
e4c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
e4d0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
e4e0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
e4f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
e500: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
e510: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e520: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
e530: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e540: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e550: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e560: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
e570: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
e580: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
e590: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  e span. */.  con
e5a0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
e5b0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
e5c0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63   the span */.  c
e5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
e5e0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e5f0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a   the span */.){.
e600: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e610: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
e620: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
e630: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e640: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e650: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e660: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e670: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
e680: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e690: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e6a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e6b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e6c0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e6d0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e6e0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
e6f0: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
e700: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
e710: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
e720: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e730: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
e740: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
e750: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
e760: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
e770: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
e780: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e790: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
e7a0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
e7b0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
e7c0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
e7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
e7e0: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
e7f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
e800: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e810: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
e820: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e830: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e840: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e850: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e860: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
e870: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
e880: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
e890: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
e8a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e8b0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
e8c0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
e8d0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
e8e0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
e8f0: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
e900: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  st..*/.static SQ
e910: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
e920: 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74  id exprListDelet
e930: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
e940: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e950: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  ){.  int i = pLi
e960: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72  st->nExpr;.  str
e970: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e980: 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73  m *pItem =  pLis
e990: 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20  t->a;.  assert( 
e9a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e9b0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
e9c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
e9d0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
e9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e9f0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
ea00: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ea10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
ea20: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
ea30: 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  Item++;.  }while
ea40: 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c  ( --i>0 );.  sql
ea50: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
ea60: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
ea70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ea80: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
ea90: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
eaa0: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
eab0: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
eac0: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
eae0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
eaf0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
eb00: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
eb10: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
eb20: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
eb30: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
eb40: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
eb50: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
eb60: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73   u32 m = 0;.  as
eb70: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
eb80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
eb90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
eba0: 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45  ){.     Expr *pE
ebb0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
ebc0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73  ].pExpr;.     as
ebd0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
ebe0: 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70  ;.     m |= pExp
ebf0: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  r->flags;.  }.  
ec00: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
ec10: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c  ** This is a SEL
ec20: 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63  ECT-node callbac
ec30: 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  k for the expres
ec40: 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74  sion walker that
ec50: 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c  .** always "fail
ec60: 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69  s".  By "fail" i
ec70: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20  n this case, we 
ec80: 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c  mean set.** pWal
ec90: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65  ker->eCode to ze
eca0: 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a  ro and abort..**
ecb0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
ecc0: 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c  k is used by mul
ecd0: 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  tiple expression
ece0: 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74   walkers..*/.int
ecf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
ed00: 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70  lkFail(Walker *p
ed10: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
ed20: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
ed30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
ed40: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
ed50: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
ed60: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ed70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
ed80: 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
ed90: 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20  n is an ID with 
eda0: 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20  the name "true" 
edb0: 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68  or "false".** th
edc0: 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  en convert it in
edd0: 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c  to an TK_TRUEFAL
ede0: 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  SE term.  Return
edf0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20   non-zero if.** 
ee00: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68  the conversion h
ee10: 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72  appened, and zer
ee20: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
ee30: 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64  ion is unaltered
ee40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee50: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
ee60: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
ee70: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ee80: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
ee90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  xpr->op==TK_STRI
eea0: 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  NG );.  if( !Exp
eeb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
eec0: 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20  pr, EP_Quoted). 
eed0: 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72    && (sqlite3Str
eee0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
eef0: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
ef00: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
ef10: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ef20: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73  >u.zToken, "fals
ef30: 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  e")==0).  ){.   
ef40: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
ef50: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72  TRUEFALSE;.    r
ef60: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
ef70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ef80: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
ef90: 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45  ust be a TK_TRUE
efa0: 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e  FALSE Expr node.
efb0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74    Return 1 if it
efc0: 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20   is TRUE.** and 
efd0: 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45  0 if it is FALSE
efe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
eff0: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63  ExprTruthValue(c
f000: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
f010: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
f020: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  pr->op==TK_TRUEF
f030: 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ALSE );.  assert
f040: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f050: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
f060: 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20  ,"true")==0.    
f070: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
f080: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
f090: 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30  oken,"false")==0
f0a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   );.  return pEx
f0b0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d  pr->u.zToken[4]=
f0c0: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  =0;.}.../*.** Th
f0d0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f0e0: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
f0f0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
f100: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
f110: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
f120: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
f130: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
f140: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
f150: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
f160: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
f170: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
f180: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
f190: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f1a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f1b0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f1c0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f1d0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f1e0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f1f0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f200: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f210: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f220: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f230: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f240: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f250: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f260: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f270: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f280: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f290: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f2a0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f2c0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f2d0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f2e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f2f0: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f300: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f310: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f320: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f330: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f340: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f350: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f360: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f370: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f380: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f390: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f3a0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f3b0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f3c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f3d0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f3e0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f3f0: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f400: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f410: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f420: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f430: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f440: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f450: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f460: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f470: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f480: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f490: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f4a0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f4b0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f4c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f4d0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f4e0: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f4f0: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f500: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f510: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f520: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f530: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f540: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f550: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f560: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f570: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f580: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f590: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f5a0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f5b0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f5c0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f5d0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f5e0: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f5f0: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f600: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f610: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f620: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f630: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f640: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f650: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f660: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f670: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f680: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f690: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f6a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f6b0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f6c0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f6d0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f6e0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f6f0: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f700: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f710: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f720: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f730: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f740: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f750: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f760: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f770: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f780: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f790: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
f7a0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
f7b0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
f7c0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
f7d0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
f7e0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f7f0: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
f800: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
f810: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
f820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f830: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f850: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f860: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f870: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f880: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f890: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
f8a0: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
f8b0: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
f8c0: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
f8d0: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
f8e0: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
f8f0: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
f900: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
f910: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
f920: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
f930: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f940: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f950: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f960: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
f970: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
f980: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
f990: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
f9a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
f9b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f9c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f9d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f9e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f9f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fa00: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fa10: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
fa20: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
fa30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fa40: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
fa50: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
fa60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fa70: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
fa80: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
fa90: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
faa0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fab0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fac0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
fad0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
fae0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
faf0: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
fb00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fb10: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fb20: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fb30: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
fb40: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
fb50: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
fb60: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
fb70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
fb90: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fba0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fbb0: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fbc0: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fbd0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fbe0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fbf0: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fc00: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fc10: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fc20: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fc30: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
fc40: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
fc50: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fc60: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fc70: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fc80: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
fc90: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
fca0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
fcb0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
fcc0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
fcd0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fce0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
fcf0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
fd00: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
fd10: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
fd20: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
fd30: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
fd40: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
fd50: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fd60: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
fd70: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
fd80: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fd90: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
fda0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
fdb0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
fdc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fdd0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fde0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
fdf0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
fe00: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
fe10: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe20: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fe30: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fe40: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fe50: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fe60: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe70: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
fe80: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fe90: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fea0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
feb0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fec0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
fed0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
fee0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
fef0: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
ff00: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
ff10: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
ff20: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
ff30: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
ff40: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
ff50: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ff60: 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
ff70: 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
ff80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ff90: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ffa0: 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
ffb0: 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
ffc0: 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
ffd0: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
ffe0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
fff0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10000 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10010 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10020 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10030 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10050 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
10060 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
10070 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
10080 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
10090 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
100a0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
100b0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
100c0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
100d0 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
100e0 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
100f0 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10100 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10110 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10120 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10130 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10140 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
10150 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
10160 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
10170 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
10180 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10190 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
101a0 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
101b0 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
101c0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
101d0 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
101e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
101f0 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10200 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10210 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10220 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10230 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
10240 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
10250 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
10260 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
10270 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
10280 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
10290 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
102a0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
102b0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
102c0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
102d0 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
102e0 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
102f0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10300 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10310 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10320 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10330 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
10340 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
10350 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10360 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
10370 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
10380 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
10390 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
103a0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
103b0 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
103c0 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
103d0 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
103e0 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
103f0 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10400 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10410 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10420 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10430 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
10440 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
10450 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
10460 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
10470 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
10480 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
10490 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
104a0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
104b0 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
104c0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
104d0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
104e0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
104f0 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10500 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10510 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10520 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10530 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
10540 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
10550 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
10560 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10570 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
10580 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
10590 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
105a0 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
105b0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
105c0 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
105d0 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
105e0 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
105f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10600 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10610 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10620 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10630 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
10640 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
10650 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
10660 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
10670 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
10680 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
10690 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
106a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
106b0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
106c0 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
106d0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
106e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
106f0 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10700 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10710 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10720 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10730 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10740 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10760 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10770 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
10780 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
10790 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
107a0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
107b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
107c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
107d0 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
107e0 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
107f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10800 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10810 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10820 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10830 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
10840 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
10850 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
10860 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10870 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
10880 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
10890 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
108a0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
108b0 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
108c0 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
108d0 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
108e0 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
108f0 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10900 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10920 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10930 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
10940 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
10950 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
10960 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
10970 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
10980 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
10990 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
109a0 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
109b0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
109c0 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
109d0 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
109e0 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
109f0 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10a00 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10a10 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10a20 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10a30 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
10a40 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
10a50 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
10a60 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
10a70 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
10a80 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
10a90 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10aa0 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10ab0 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10ac0 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10ad0 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10ae0 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10af0 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10b00 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10b10 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10b20 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10b30 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
10b40 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
10b50 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
10b60 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
10b70 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
10b80 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
10b90 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10ba0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10bb0 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10bc0 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10bd0 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10be0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10bf0 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10c00 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10c10 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10c20 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10c30 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10c40 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10c50 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10c60 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10c70 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10c80 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10c90 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10ca0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10cb0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10cc0 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10cd0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10ce0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10cf0 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10d00 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10d10 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10d20 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10d30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10d40 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10d50 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10d60 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10d70 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10d80 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10d90 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10db0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10dc0 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10dd0 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10de0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10df0 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10e00 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10e10 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10e20 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10e30 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10e40 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10e50 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10e60 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10e70 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10e80 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10e90 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
10ea0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
10eb0 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
10ec0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10ed0 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
10ee0 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10ef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10f00 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
10f10 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
10f20 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
10f30 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
10f40 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
10f50 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10f60 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
10f70 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
10f80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
10f90 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
10fa0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10fb0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10fc0 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
10fd0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
10fe0 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
10ff0 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
11000 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
11010 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
11020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11030 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
11040 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
11050 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11060 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11070 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
11080 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
11090 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
110a0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
110b0 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
110c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
110d0 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
110e0 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
110f0 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
11100 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
11110 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
11120 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
11130 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
11140 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
11150 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
11160 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
11170 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
11180 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
11190 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
111a0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
111b0 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
111c0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
111d0 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
111e0 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
111f0 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11200 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11210 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11220 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11230 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
11240 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
11250 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
11260 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11270 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11280 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
11290 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
112a0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
112b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
112c0 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
112d0 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
112e0 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
112f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11300 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11310 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11320 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11330 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11340 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
11350 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
11360 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11370 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
11380 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
11390 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
113a0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
113b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
113c0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
113d0 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
113e0 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
113f0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11400 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11410 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11420 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11430 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11440 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11450 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
11460 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11470 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11480 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
11490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
114a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
114b0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
114c0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
114d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
114e0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
114f0 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11500 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11510 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11520 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11530 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11540 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11560 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
11570 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
11580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11590 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
115a0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
115b0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
115c0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
115d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
115e0 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
115f0 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11600 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11610 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11620 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11630 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11640 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11650 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
11660 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
11670 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
11680 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
11690 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
116a0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
116b0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
116c0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
116d0 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
116e0 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
116f0 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11700 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11710 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11720 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11730 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11740 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
11750 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
11760 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
11770 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
11780 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
11790 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
117a0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
117b0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
117c0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
117d0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
117e0 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
117f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11800 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11810 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11820 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11830 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11840 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11850 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
11860 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
11870 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11880 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11890 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
118a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
118b0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
118c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
118d0 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
118e0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
118f0 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11900 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11910 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11920 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11930 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
11940 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
11950 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
11960 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
11970 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
11980 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
11990 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
119a0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
119b0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
119c0 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
119d0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
119e0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
119f0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11a00 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11a10 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11a20 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11a30 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11a40 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11a50 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11a60 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11a70 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11a80 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11a90 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11aa0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11ab0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11ac0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11ad0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11ae0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11af0 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11b00 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11b10 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11b20 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11b30 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11b40 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11b50 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11b60 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11b70 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11b80 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11b90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11ba0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11bb0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11bc0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11bd0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11be0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11bf0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11c00 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11c10 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11c20 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11c30 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11c40 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11c50 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11c60 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11c70 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11c80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11c90 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11ca0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11cb0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11cc0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11cd0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11ce0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11cf0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11d00 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11d10 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11d20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11d30 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11d40 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11d50 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11d60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11d70 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11d80 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11d90 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11db0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11dc0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11dd0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11de0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11df0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11e00 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11e10 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11e20 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11e30 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11e40 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11e50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11e60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11e70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11e80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11e90 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11ea0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11eb0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11ec0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11ed0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11ee0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11ef0 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11f00 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11f10 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f20 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11f30 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11f40 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f50 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11f60 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11f70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11f80 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
11f90 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
11fa0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
11fb0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11fc0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11fd0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11fe0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
11ff0 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
12000 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
12010 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
12020 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
12030 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
12040 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
12050 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
12060 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
12070 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
12080 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
12090 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
120a0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
120b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
120c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
120d0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
120e0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
120f0 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
12100 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
12110 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
12120 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
12130 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12140 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
12150 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12160 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12170 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12180 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
12190 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
121a0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
121b0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
121c0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
121d0 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
121e0 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
121f0 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12200 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12220 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12230 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
12240 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12250 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12260 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
12270 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12280 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
12290 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
122a0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
122b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
122c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
122d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
122e0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
122f0 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12300 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12310 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12320 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12330 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
12340 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12350 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
12380 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
12390 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
123a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
123b0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
123c0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
123d0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
123e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
123f0 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12400 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12410 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12430 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
12440 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
12450 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12460 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
12470 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
12480 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
12490 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
124a0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
124b0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
124c0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
124d0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
124e0 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
124f0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12500 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12510 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12520 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12530 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
12540 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
12550 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
12560 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12570 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
12580 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
12590 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
125a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
125b0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
125c0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
125d0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
125e0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
125f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12600 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12610 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12620 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12630 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
12640 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
12650 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
12660 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12670 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
12680 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
12690 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
126a0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
126b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
126c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
126d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
126e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
126f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12700 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12710 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12720 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12730 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12740 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12750 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12760 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
12770 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
12780 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
12790 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
127a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
127b0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
127c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
127d0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
127e0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
127f0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12800 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12810 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12820 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12830 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12840 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12850 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12860 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
12870 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
12880 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
12890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
128a0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
128b0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
128c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
128d0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
128e0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
128f0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12900 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12910 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12920 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12930 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12940 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12950 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12960 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
12970 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
12980 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
12990 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
129a0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
129b0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
129c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
129d0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
129e0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
129f0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12a00 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12a10 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12a20 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12a30 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12a40 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12a50 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12a60 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
12a70 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
12a80 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
12a90 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12aa0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12ab0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12ac0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12ad0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12ae0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12af0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12b00 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12b10 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12b20 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12b30 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12b40 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12b50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12b60 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
12b70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12b80 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
12b90 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12ba0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12bb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12bc0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12bd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12be0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12bf0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12c00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12c10 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12c20 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12c40 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12c50 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12c60 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12c70 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12c80 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12c90 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12ca0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12cb0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12cc0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12cd0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12ce0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12cf0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12d00 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12d10 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12d20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12d30 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12d40 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12d50 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12d60 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12d70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12d80 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12d90 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12da0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12db0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12dc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12dd0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12de0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12df0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12e00 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12e10 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12e20 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12e30 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12e40 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12e50 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12e60 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12e70 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12e80 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12e90 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12ea0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12eb0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12ec0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12ed0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12ee0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
12f10 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
12f20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
12f30 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
12f40 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
12f50 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
12f60 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
12f90 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
12fa0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
12fb0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
12fc0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
12fd0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
12fe0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
12ff0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
13000 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
13010 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13020 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
13030 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
13040 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
13050 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13060 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13070 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
13080 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
13090 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
130a0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
130b0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
130c0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
130d0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
130e0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
130f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
13100 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
13110 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
13120 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
13130 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
13140 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
13150 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
13160 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
13170 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
13180 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
13190 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
131a0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
131b0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
131c0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
131d0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
131e0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
131f0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13200 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13210 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13220 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13230 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
13240 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
13250 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
13260 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
13270 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
13280 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13290 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
132a0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
132b0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
132c0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
132d0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
132e0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
132f0 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13300 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13310 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13320 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13330 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
13340 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
13350 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
13360 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
13370 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
13380 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
13390 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
133a0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
133b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
133c0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
133d0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
133e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
133f0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13400 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13410 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13420 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13430 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
13440 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
13450 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
13460 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
13470 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
13480 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
13490 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
134a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
134b0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
134c0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
134d0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
134e0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
134f0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13500 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13510 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13520 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13530 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
13540 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
13550 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13560 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
13570 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
13580 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
13590 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
135a0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
135b0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
135c0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
135d0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
135e0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
135f0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13600 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13610 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13620 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13630 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
13640 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
13650 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
13660 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
13670 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
13680 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
13690 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
136a0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
136b0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
136c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
136d0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
136e0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
136f0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13700 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13710 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13720 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13730 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13740 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13750 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13760 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
13770 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
13780 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
13790 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
137a0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
137b0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
137c0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
137d0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
137e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
137f0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13800 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13810 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13820 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13830 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13840 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13850 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13860 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
13870 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13880 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
13890 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
138a0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
138b0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
138c0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
138d0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
138e0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
138f0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13900 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13910 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13920 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13930 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13940 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13950 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13960 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
13970 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
13980 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
13990 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
139a0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
139b0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
139c0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
139d0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
139e0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
139f0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13a00 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13a10 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13a20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13a30 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13a40 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13a50 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13a60 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
13a70 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
13a80 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
13a90 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13aa0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13ab0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13ac0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13ad0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13ae0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13af0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13b00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13b10 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13b20 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13b30 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13b40 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13b50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13b60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
13b80 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
13b90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13ba0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13bb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13bc0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13be0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13bf0 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13c00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13c10 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13c20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13c30 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13c40 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13c50 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13c60 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13c70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13c80 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13c90 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13ca0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13cb0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13cc0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13cd0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13ce0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13cf0 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d10 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13d20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13d30 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13d60 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13d70 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13d80 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13db0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13dc0 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13dd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13de0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13df0 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13e00 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13e10 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13e40 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13e50 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13e60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13e80 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13e90 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13ea0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13eb0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13ec0 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13ed0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13ee0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13ef0 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
13f00 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
13f10 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
13f20 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
13f30 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
13f40 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
13f50 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
13f60 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
13f70 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
13f80 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
13f90 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
13fa0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
13fb0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
13fc0 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
13fd0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
13fe0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
13ff0 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
14000 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
14010 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
14020 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
14030 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
14040 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
14050 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
14060 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14070 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
14080 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
14090 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
140a0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
140b0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
140c0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
140d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
140e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
140f0 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
14100 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
14110 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14120 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
14130 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
14140 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
14150 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14160 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
14170 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14180 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
14190 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
141a0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
141b0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
141c0 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
141d0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
141e0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
141f0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14200 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14210 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14220 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14230 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14240 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14260 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14270 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
14280 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142a0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
142b0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142e0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
142f0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14300 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14310 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14320 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14330 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
14340 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14350 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
14360 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14370 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14380 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14390 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
143a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
143b0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
143c0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
143d0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
143e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
143f0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14400 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14410 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14420 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14430 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
14440 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
14450 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
14460 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
14470 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
14480 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
14490 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
144a0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
144b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
144c0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
144d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
144e0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
144f0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14500 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14510 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14520 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14530 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
14540 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
14550 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
14560 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
14570 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
14580 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
14590 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
145a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
145b0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
145c0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
145d0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
145e0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
145f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14600 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14610 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14620 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14630 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
14640 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
14650 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
14660 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
14670 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14680 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
14690 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
146a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
146b0 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
146c0 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
146d0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
146e0 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
146f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14700 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14710 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14720 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14730 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
14740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14750 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14760 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14770 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
14780 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
14790 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
147a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
147b0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
147c0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
147d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
147e0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
147f0 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14800 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14810 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14820 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14830 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
14840 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
14850 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14860 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
14870 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
14880 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
14890 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
148a0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
148b0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
148c0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
148d0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
148e0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
148f0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14900 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14910 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14920 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14930 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14940 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14950 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
14960 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
14970 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14980 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
14990 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
149a0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
149b0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
149c0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
149d0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
149e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
149f0 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14a00 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14a10 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14a20 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14a30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14a40 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
14a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14a60 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14a70 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
14a80 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
14a90 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14aa0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14ab0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14ac0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14ad0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14ae0 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14af0 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14b00 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14b20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14b30 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
14b40 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
14b50 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
14b60 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
14b70 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
14b80 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14b90 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14ba0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14bc0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14bd0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14bf0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14c00 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14c10 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14c20 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14c30 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14c40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14c50 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14c60 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14c70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14c80 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14c90 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14ca0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14cb0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14cc0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14cd0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14ce0 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14cf0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14d00 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14d10 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14d20 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14d30 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14d40 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14d60 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14d70 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14d80 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14d90 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14da0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14db0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14dc0 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14dd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14de0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14df0 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14e00 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14e10 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14e20 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14e30 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14e40 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14e50 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14e60 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14e70 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14e80 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14e90 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14ea0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14ec0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14ed0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14ee0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14ef0 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14f00 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14f10 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
14f20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
14f30 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
14f40 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
14f50 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
14f60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14f70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14f80 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
14f90 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
14fa0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14fb0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14fd0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14fe0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
14ff0 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
15000 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
15010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
15020 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
15030 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15040 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
15050 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15060 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
15070 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
15080 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
15090 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
150a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
150b0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
150c0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
150d0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
150e0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
150f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
15100 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
15110 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
15120 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
15130 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
15140 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
15150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
15160 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
15170 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
15180 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15190 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
151a0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
151b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
151c0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
151d0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
151e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
151f0 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15200 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15210 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15220 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
15240 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15280 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
15290 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
152a0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
152b0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
152c0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
152d0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
152e0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
152f0 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15300 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15310 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15330 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
15340 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
15350 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
15360 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
15370 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
15380 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
15390 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
153a0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
153b0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
153c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
153d0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
153e0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
153f0 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15400 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15410 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15420 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15430 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
15440 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
15450 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15460 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
15470 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
154a0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
154b0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
154c0 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
154d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
154f0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15500 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15510 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15520 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15530 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15540 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
15550 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15560 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
15570 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15580 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
15590 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
155a0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
155b0 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
155c0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
155d0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
155e0 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
155f0 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15600 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15610 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15620 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15630 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
15640 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15650 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
15660 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
15670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15680 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
15690 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
156a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156b0 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
156c0 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
156d0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
156e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
156f0 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15700 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15710 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15720 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15740 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15750 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
15760 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
15770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15790 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
157a0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
157b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
157c0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
157d0 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
157e0 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
157f0 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15800 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15810 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15820 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15830 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15840 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
15850 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
15860 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
15870 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
15880 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
15890 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
158a0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
158b0 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
158c0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
158d0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
158e0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
158f0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15900 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15910 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15920 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15930 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15940 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
15950 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
15960 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
15970 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
15980 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
15990 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
159a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
159b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
159c0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
159d0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
159e0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
159f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15a00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15a10 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15a20 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15a30 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15a40 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
15a50 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
15a60 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
15a70 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
15a80 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
15a90 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15aa0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15ab0 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15ac0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15ad0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15ae0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15af0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15b00 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15b10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15b20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15b30 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15b40 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
15b50 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
15b60 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15b70 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
15b80 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
15b90 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15ba0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15bb0 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
15bc0 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
15bd0 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
15be0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15bf0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15c00 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
15c10 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
15c20 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
15c30 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15c40 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15c50 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15c60 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15c70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15c80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15c90 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15cb0 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15cc0 70 58 2c 20 69 54 61 62 2c 20 65 54 79 70 65 3d  pX, iTab, eType=
15cd0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
15ce0 3b 0a 20 20 20 20 69 66 28 20 72 4d 61 79 48 61  ;.    if( rMayHa
15cf0 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
15d00 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15d10 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 72  lFlag(v, iTab, r
15d20 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
15d30 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
15d40 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
15d50 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
15d60 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26  }..  if( aiMap &
15d70 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15d80 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65  X_INDEX_ASC && e
15d90 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15da0 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
15db0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
15dc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
15dd0 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65  ctorSize(pX->pLe
15de0 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ft);.    for(i=0
15df0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61  ; i<n; i++) aiMa
15e00 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  p[i] = i;.  }.  
15e10 2a 70 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  *piTab = iTab;. 
15e20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
15e30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
15e40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15e50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
15e60 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
15e70 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
15e80 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
15e90 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
15ea0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
15eb0 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
15ec0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
15ed0 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
15ee0 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
15ef0 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
15f00 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
15f10 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
15f20 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
15f30 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15f40 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
15f50 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
15f60 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
15f70 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15f80 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
15f90 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
15fa0 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
15fb0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15fc0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15fd0 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
15fe0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
15ff0 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
16000 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16010 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
16020 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
16030 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
16040 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
16050 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
16060 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
16070 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
16080 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
16090 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
160a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
160b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
160c0 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
160d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
160e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
160f0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
16100 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
16110 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
16120 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
16130 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
16140 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
16150 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
16160 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
16170 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
16180 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
16190 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
161a0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
161b0 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
161c0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
161d0 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
161e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
161f0 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
16200 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
16210 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
16220 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16230 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
16240 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
16250 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
16260 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16270 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
16280 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
16290 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
162a0 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
162b0 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
162c0 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
162d0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
162e0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
162f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16300 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
16310 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
16320 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
16330 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16340 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
16350 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
16360 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16370 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
16380 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
16390 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
163a0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
163b0 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
163c0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
163d0 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
163e0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
163f0 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
16400 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
16410 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
16420 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
16430 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
16440 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
16450 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16460 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
16470 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
16480 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
16490 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
164a0 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
164b0 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
164c0 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
164d0 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
164e0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
164f0 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
16500 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
16510 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
16520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16530 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
16540 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
16550 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16560 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
16570 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
16580 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
16590 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
165a0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
165b0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
165c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
165d0 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
165e0 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ed");.  }.}..#if
165f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16600 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16610 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16620 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63  at will construc
16630 74 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  t an ephemeral t
16640 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
16650 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20  all terms.** in 
16660 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
16670 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
16680 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  IN operator can 
16690 62 65 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  be in either of 
166a0 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a  two.** forms:.**
166b0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
166c0 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
166d0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
166e0 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
166f0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
16700 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
16710 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
16720 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
16730 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
16740 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
16750 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
16760 65 74 65 72 20 69 73 20 74 68 65 20 49 4e 20 6f  eter is the IN o
16770 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 63 75  perator.  The cu
16780 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
16790 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  the.** construct
167a0 65 64 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61  ed ephermeral ta
167b0 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
167c0 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
167d0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a   the ephemeral.*
167e0 2a 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 75  * table is compu
167f0 74 65 64 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ted, the cursor 
16800 6e 75 6d 62 65 72 20 69 73 20 61 6c 73 6f 20 73  number is also s
16810 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16820 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76  iTable,.** howev
16830 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  er the cursor nu
16840 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 6d 69  mber returned mi
16850 67 68 74 20 6e 6f 74 20 62 65 20 74 68 65 20 73  ght not be the s
16860 61 6d 65 2c 20 61 73 20 69 74 20 6d 69 67 68 74  ame, as it might
16870 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75  .** have been du
16880 70 6c 69 63 61 74 65 64 20 75 73 69 6e 67 20 4f  plicated using O
16890 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a  P_OpenDup..**.**
168a0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
168b0 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
168c0 6f 2c 20 74 68 65 6e 20 4c 48 53 20 6f 66 20 74  o, then LHS of t
168d0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
168e0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
168f0 74 6f 20 62 65 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  to be a non-null
16900 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69   integer. In thi
16910 73 20 63 61 73 65 2c 20 74 68 65 20 65 70 68 65  s case, the ephe
16920 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 61 6e 20  meral table can 
16930 62 65 20 61 6e 0a 2a 2a 20 74 61 62 6c 65 20 42  be an.** table B
16940 2d 54 72 65 65 20 74 68 61 74 20 6b 65 79 65 64  -Tree that keyed
16950 20 62 79 20 6f 6e 6c 79 20 69 6e 74 65 67 65 72   by only integer
16960 73 2e 20 20 54 68 65 20 6d 6f 72 65 20 67 65 6e  s.  The more gen
16970 65 72 61 6c 20 63 61 73 65 73 20 75 73 65 73 0a  eral cases uses.
16980 2a 2a 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  ** an index B-Tr
16990 65 65 20 77 68 69 63 68 20 63 61 6e 20 68 61 76  ee which can hav
169a0 65 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 73  e arbitrary keys
169b0 2c 20 62 75 74 20 69 73 20 73 6c 6f 77 65 72 20  , but is slower 
169c0 74 6f 20 62 6f 74 68 0a 2a 2a 20 72 65 61 64 20  to both.** read 
169d0 61 6e 64 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  and write..**.**
169e0 20 49 66 20 74 68 65 20 4c 48 53 20 65 78 70 72   If the LHS expr
169f0 65 73 73 69 6f 6e 20 28 22 78 22 20 69 6e 20 74  ession ("x" in t
16a00 68 65 20 65 78 61 6d 70 6c 65 73 29 20 69 73 20  he examples) is 
16a10 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16a20 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  or.** the SELECT
16a30 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16a40 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16a50 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16a60 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nity of that.** 
16a70 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
16a80 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
16a90 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16aa0 27 78 27 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53  'x' and the.** S
16ab0 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
16ac0 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
16ad0 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
16ae0 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 2a 2a  inity is used.**
16af0 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16b00 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16b10 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16b20 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  y. If neither.**
16b30 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
16b40 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16b50 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16b60 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16b70 69 74 79 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a  ity.** is used..
16b80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
16b90 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20 20 50 61  odeRhsOfIN(.  Pa
16ba0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16bb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16bc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16bd0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
16bf0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
16c00 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
16c10 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
16c20 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  s cursor number 
16c30 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c50 49 66 20 74 72 75 65 2c 20 4c 48 53 20 69 73 20  If true, LHS is 
16c60 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
16c70 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
16c80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
16c90 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
16ca0 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
16cb0 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e  n at top */.  in
16cc0 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
16cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16ce0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
16cf0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
16d00 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
16d10 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
16d20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48 53        /* the LHS
16d30 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16d40 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  tor */.  KeyInfo
16d50 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
16d60 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
16d70 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
16d80 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
16d90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16da0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
16db0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
16de0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
16df0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
16e00 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  /..  v = pParse-
16e10 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
16e20 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
16e30 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
16e40 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62 65  f the IN must be
16e50 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
16e60 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
16e70 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
16e80 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
16e90 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
16ea0 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
16eb0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16ec0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
16ed0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
16ee0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
16ef0 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
16f00 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
16f10 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
16f20 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
16f30 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
16f40 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
16f50 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
16f60 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
16f70 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70  then we can comp
16f80 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73 74  ute the RHS just
16f90 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72   once.  ** and r
16fa0 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d  euse it many nam
16fb0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
16fc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16fd0 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
16fe0 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d 3e  ect) && pParse->
16ff0 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20  iSelfTab==0 ){. 
17000 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20 74     /* Reuse of t
17010 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77 65  he RHS is allowe
17020 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  d */.    /* If t
17030 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
17040 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
17050 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65 76  ed, but the prev
17060 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a  ious code.    **
17070 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
17080 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74  been invoked yet
17090 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e  , so invoke it n
170a0 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  ow as a subrouti
170b0 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ne. .    */.    
170c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
170d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
170e0 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 61  brtn) ){.      a
170f0 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
17100 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
17110 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
17120 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17130 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
17140 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17150 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
17160 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17170 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
17180 20 22 52 45 55 53 45 20 4c 49 53 54 20 53 55 42   "REUSE LIST SUB
17190 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
171a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
171b0 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64  x.pSelect->selId
171c0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
171d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
171f0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
17200 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20 20  gReturn,.       
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
17230 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
17240 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17250 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54 61   OP_OpenDup, iTa
17260 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  b, pExpr->iTable
17270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17280 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17290 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
172a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
172b0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64      /* Begin cod
172c0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
172d0 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65  ne */.    ExprSe
172e0 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
172f0 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20   EP_Subrtn);.   
17300 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
17310 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
17320 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45  se->nMem;.    pE
17330 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72  xpr->y.sub.iAddr
17340 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
17350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17360 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78  _Integer, 0, pEx
17370 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
17380 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64  urn) + 1;.    Vd
17390 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
173a0 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29 29  eturn address"))
173b0 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20  ;..    addrOnce 
173c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
173d0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
173e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
173f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
17400 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
17410 20 69 73 20 61 20 76 65 63 74 6f 72 20 49 4e 20   is a vector IN 
17420 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70 4c  operator */.  pL
17430 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17440 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71 6c  ft;.  nVal = sql
17450 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
17460 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 61 73 73  ze(pLeft);.  ass
17470 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c  ert( !isRowid ||
17480 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 2f   nVal==1 );..  /
17490 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
174a0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
174b0 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69  that will contai
174c0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
174d0 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68 65  .  ** RHS of the
174e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
174f0 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  */.  pExpr->iTab
17500 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64 64  le = iTab;.  add
17510 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17530 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
17540 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
17550 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c   (isRowid?0:nVal
17560 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
17570 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
17580 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20  _COMMENTS.  if( 
17590 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
175a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
175b0 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65  ect) ){.    Vdbe
175c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73  Comment((v, "Res
175d0 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75  ult of SELECT %u
175e0 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ", pExpr->x.pSel
175f0 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  ect->selId));.  
17600 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43  }else{.    VdbeC
17610 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20  omment((v, "RHS 
17620 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29  of IN operator")
17630 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17640 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
17650 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
17660 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
17670 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
17680 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  );..  if( ExprHa
17690 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
176a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
176b0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
176c0 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
176d0 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a  LECT ...).    **
176e0 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65  .    ** Generate
176f0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
17700 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
17710 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
17720 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
17730 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
17740 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
17750 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ove..    */.    
17760 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
17770 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
17780 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ct;.    ExprList
17790 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
177a0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
177b0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
177c0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
177d0 73 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25  sLIST SUBQUERY %
177e0 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72  d",.        addr
177f0 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41  Once?"":"CORRELA
17800 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e  TED ", pSelect->
17810 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20  selId.    ));.  
17820 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
17830 69 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  id );.    /* If 
17840 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20  the LHS and RHS 
17850 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17860 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c  or do not match,
17870 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 72 72   that.    ** err
17880 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
17890 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
178a0 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
178b0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
178c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
178d0 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29  st->nExpr==nVal)
178e0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
178f0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
17900 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
17910 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
17920 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
17930 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 20  et, iTab);.     
17940 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
17950 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
17960 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
17970 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
17980 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17990 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
179a0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
179b0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
179c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
179d0 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
179e0 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
179f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
17a00 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
17a10 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
17a20 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
17a30 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
17a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17a50 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17a60 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
17a80 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
17a90 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  nfo);.        re
17aa0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
17ab0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17ac0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
17ad0 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
17ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
17af0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
17b00 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
17b10 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
17b20 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
17b30 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
17b40 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
17b50 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
17b60 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  r>0 );.      ass
17b70 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17b80 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17b90 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17ba0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
17bb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
17bc0 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
17bd0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
17be0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
17bf0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
17c00 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
17c10 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
17c20 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20  eCollSeq(.      
17c30 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
17c40 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
17c50 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
17c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17c70 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
17c80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
17c90 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  0) ){.    /* Cas
17ca0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
17cb0 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
17cc0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65 61  **.    ** For ea
17cd0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
17ce0 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
17cf0 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
17d00 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  ation and.    **
17d10 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
17d20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17d30 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
17d40 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
17d50 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f  e.    ** that co
17d60 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
17d70 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
17d80 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
17d90 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  r> is not.    **
17da0 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
17db0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
17dc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
17dd0 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
17de0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
17df0 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
17e00 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69 6e  the IN */.    in
17e10 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
17e20 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
17e30 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 73  ->x.pList;.    s
17e40 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17e50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
17e60 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
17e70 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
17e80 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
17e90 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  ty(pLeft);.    i
17ea0 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
17eb0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
17ec0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
17ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17ee0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17ef0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17f00 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
17f10 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17f20 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
17f30 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
17f40 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
17f50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17f60 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eft);.    }..   
17f70 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17f80 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17f90 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
17fa0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
17fb0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17fc0 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
17fd0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17fe0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  g(pParse);.    i
17ff0 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
18000 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18010 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32  , OP_Blob, 0, r2
18020 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
18030 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  IC);.    for(i=p
18040 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
18050 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
18060 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
18070 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32  .      Expr *pE2
18080 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
18090 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54  .      int iValT
180a0 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oIns;..      /* 
180b0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
180c0 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
180d0 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
180e0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
180f0 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
18100 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
18110 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
18120 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
18130 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
18140 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
18150 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
18160 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
18170 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
18180 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
18190 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
181a0 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   time..      */.
181b0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e        if( addrOn
181c0 63 65 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  ce && !sqlite3Ex
181d0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
181e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
181f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
18200 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e 63 65  Noop(v, addrOnce
18210 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  );.        addrO
18220 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
18230 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
18240 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
18250 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
18260 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
18270 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  able */.      if
18280 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
18290 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
182a0 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
182b0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  s) ){.        sq
182c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
182d0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
182e0 20 69 54 61 62 2c 20 72 32 2c 20 69 56 61 6c 54   iTab, r2, iValT
182f0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oIns);.      }el
18300 73 65 7b 0a 20 20 20 20 20 20 20 20 72 33 20 3d  se{.        r3 =
18310 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18320 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
18330 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
18340 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
18350 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18360 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18370 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
18380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
183a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
183b0 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
183c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
183d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
183e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
183f0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
18400 69 54 61 62 2c 20 72 32 2c 20 72 33 29 3b 0a 20  iTab, r2, r3);. 
18410 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18430 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18440 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
18450 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
18460 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
18470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18480 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
18490 73 65 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20  sert, iTab, r2, 
184a0 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
184b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
184c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
184d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
184e0 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
184f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18500 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
18510 7d 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  }.  if( pKeyInfo
18520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18530 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
18540 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
18550 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
18560 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64  O);.  }.  if( ad
18570 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71  drOnce ){.    sq
18580 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18590 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
185a0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
185b0 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  e return */.    
185c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
185d0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
185e0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
185f0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c  Return);.    sql
18600 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
18610 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  (v, pExpr->y.sub
18620 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65  .iAddr-1, sqlite
18630 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18640 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  (v)-1);.  }.}.#e
18650 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18660 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
18670 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18680 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
18690 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
186a0 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
186b0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45  pression.** or E
186c0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 3a 0a  XISTS operator:.
186d0 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
186e0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
186f0 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
18700 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
18710 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
18720 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
18730 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  query.**.** The 
18740 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
18750 69 73 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  is the SELECT or
18760 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18770 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2a   to be coded..**
18780 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
18790 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
187a0 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d  result.  For a m
187b0 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45  ulti-column SELE
187c0 43 54 2c 20 0a 2a 2a 20 74 68 65 20 72 65 73 75  CT, .** the resu
187d0 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
187e0 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 72 72  a contiguous arr
187f0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
18800 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  and the.** retur
18810 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72  n value is the r
18820 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c  egister of the l
18830 65 66 74 2d 6d 6f 73 74 20 72 65 73 75 6c 74 20  eft-most result 
18840 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52 65 74 75 72  column..** Retur
18850 6e 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72 20  n 0 if an error 
18860 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  occurs..*/.#ifnd
18870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
18880 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
18890 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
188a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
188b0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
188c0 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
188d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
188e0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 6e 63  ddress of OP_Onc
188f0 65 20 61 74 20 74 6f 70 20 6f 66 20 73 75 62 72  e at top of subr
18900 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18910 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rReg = 0;       
18920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18930 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
18940 6c 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63  lting */.  Selec
18950 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
18960 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
18970 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
18980 63 6f 64 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  code */.  Select
18990 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
189a0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
189b0 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54  deal with SELECT
189c0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
189d0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
189e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
189f0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
18a00 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
18a10 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
18a20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20     /* New limit 
18a30 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20  expression */.. 
18a40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
18a50 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
18a60 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 74 65  rt( v!=0 );.  te
18a70 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
18a80 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
18a90 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18aa0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18ac0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
18ad0 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
18ae0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
18af0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
18b00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18b10 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18b20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
18b30 78 2e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  x.pSelect;..  /*
18b40 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
18b50 6f 66 20 74 68 65 20 45 58 49 53 54 53 2f 53 45  of the EXISTS/SE
18b60 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72 65 70  LECT must be rep
18b70 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65  eated every time
18b80 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f   it.  ** is enco
18b90 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f  untered if any o
18ba0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
18bb0 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
18bc0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
18bd0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
18be0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
18bf0 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
18c00 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
18c10 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
18c20 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
18c30 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
18c40 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
18c50 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
18c60 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
18c70 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
18c80 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
18c90 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
18ca0 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
18cb0 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
18cc0 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
18cd0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
18ce0 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
18cf0 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
18d00 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
18d10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18d20 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
18d30 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72      /* If this r
18d40 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61  outine has alrea
18d50 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20 74  dy been coded, t
18d60 68 65 6e 20 69 6e 76 6f 6b 65 20 69 74 20 61 73  hen invoke it as
18d70 20 61 0a 20 20 20 20 2a 2a 20 73 75 62 72 6f 75   a.    ** subrou
18d80 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tine. */.    if(
18d90 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18da0 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74  (pExpr, EP_Subrt
18db0 6e 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  n) ){.      Expl
18dc0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18dd0 61 72 73 65 2c 20 30 2c 20 22 52 45 55 53 45 20  arse, 0, "REUSE 
18de0 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 70 53  SUBQUERY %d", pS
18df0 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  el->selId));.   
18e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18e10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
18e20 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
18e30 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  egReturn,.      
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
18e60 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
18e70 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  urn pExpr->iTabl
18e80 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
18e90 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74 68   Begin coding th
18ea0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  e subroutine */.
18eb0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
18ec0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
18ed0 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70 72  brtn);.    pExpr
18ee0 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
18ef0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
18f00 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79  em;.    pExpr->y
18f10 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20 20  .sub.iAddr =.   
18f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18f30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18f40 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79 2e  er, 0, pExpr->y.
18f50 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20 2b  sub.regReturn) +
18f60 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d   1;.    VdbeComm
18f70 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e 20  ent((v, "return 
18f80 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20 20  address"));..   
18f90 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
18fa0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
18fb0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
18fc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18fd0 20 20 0a 20 20 2f 2a 20 46 6f 72 20 61 20 53 45    .  /* For a SE
18fe0 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
18ff0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
19000 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
19010 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
19020 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
19030 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
19040 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
19050 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
19060 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
19070 67 69 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  gister..  **.  *
19080 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
19090 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
190a0 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
190b0 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
190c0 69 73 74 73 29 0a 20 20 2a 2a 20 69 6e 74 6f 20  ists).  ** into 
190d0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
190e0 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
190f0 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a  ter number..  **
19100 0a 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61  .  ** In both ca
19110 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
19120 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
19130 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
19140 20 0a 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69   .  ** preexisti
19150 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
19160 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
19170 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
19180 31 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 6c 61 69  1..  */.  Explai
19190 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
191a0 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c 41 52  se, 1, "%sSCALAR
191b0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
191c0 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f         addrOnce?
191d0 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
191e0 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b  , pSel->selId));
191f0 0a 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d  .  nReg = pExpr-
19200 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
19210 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
19220 45 78 70 72 20 3a 20 31 3b 0a 20 20 73 71 6c 69  Expr : 1;.  sqli
19230 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
19240 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
19250 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 70  se->nMem+1);.  p
19260 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
19270 52 65 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Reg;.  if( pExpr
19280 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
19290 29 7b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  ){.    dest.eDes
192a0 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
192b0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
192c0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
192d0 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65  dest.nSdst = nRe
192e0 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  g;.    sqlite3Vd
192f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
19300 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
19310 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61  Parm, dest.iSDPa
19320 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  rm+nReg-1);.    
19330 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19340 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
19350 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 65 6c 73  esult"));.  }els
19360 65 7b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  e{.    dest.eDes
19370 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
19380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
193a0 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
193b0 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43  Parm);.    VdbeC
193c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
193d0 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
193e0 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 6d 69 74 20  );.  }.  pLimit 
193f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
19400 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
19410 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74  K_INTEGER,&sqlit
19420 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
19430 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  0);.  if( pSel->
19440 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
19450 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19460 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
19470 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29  ->pLimit->pLeft)
19480 3b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d  ;.    pSel->pLim
19490 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d  it->pLeft = pLim
194a0 69 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  it;.  }else{.   
194b0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
194c0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
194d0 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70  rse, TK_LIMIT, p
194e0 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  Limit, 0);.  }. 
194f0 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
19500 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
19510 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19520 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
19530 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19540 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
19550 20 3d 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69   = rReg = dest.i
19560 53 44 50 61 72 6d 3b 0a 20 20 45 78 70 72 53 65  SDParm;.  ExprSe
19570 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
19580 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
19590 3b 0a 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65  ;.  if( addrOnce
195a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
195b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
195c0 64 64 72 4f 6e 63 65 29 3b 0a 0a 20 20 20 20 2f  ddrOnce);..    /
195d0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
195e0 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  urn */.    sqlit
195f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19600 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70 72  OP_Return, pExpr
19610 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
19620 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
19630 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 70  dbeChangeP1(v, p
19640 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
19650 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  r-1, sqlite3Vdbe
19660 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
19670 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
19680 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
19690 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
196a0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
196b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
196c0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
196d0 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
196e0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
196f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
19700 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
19710 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
19720 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
19730 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
19740 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
19750 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
19760 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
19770 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
19780 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
19790 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
197a0 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
197b0 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
197c0 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
197d0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
197e0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
197f0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19800 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
19810 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
19820 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
19830 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
19840 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
19850 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
19860 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
19870 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
19880 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
19890 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
198a0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
198b0 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
198c0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
198d0 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
198e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
198f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
19900 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
19910 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
19920 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19930 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
19940 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19950 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
19960 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
19970 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19980 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
19990 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
199a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
199b0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
199c0 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
199d0 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
199e0 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
199f0 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
19a00 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
19a10 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
19a20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
19a30 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
19a40 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
19a50 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
19a60 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
19a70 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
19a80 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
19a90 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
19aa0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
19ab0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
19ac0 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
19ad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
19ae0 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
19af0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
19b00 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
19b10 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
19b20 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
19b30 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
19b40 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
19b50 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
19b60 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
19b70 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
19b80 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
19b90 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
19ba0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
19bb0 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
19bc0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
19bd0 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
19be0 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
19bf0 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
19c00 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
19c10 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
19c20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
19c30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19c40 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
19c50 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
19c60 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
19c70 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
19c80 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
19c90 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
19ca0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
19cb0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
19cc0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
19cd0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
19ce0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
19cf0 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
19d00 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
19d10 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
19d20 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
19d30 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
19d40 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
19d50 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
19d60 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
19d70 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
19d80 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
19d90 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
19da0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19db0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
19dc0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
19dd0 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
19de0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19df0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
19e00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19e10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19e20 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19e30 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
19e40 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
19e50 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
19e60 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19e70 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
19e80 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
19e90 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
19ea0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
19eb0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
19ec0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
19ed0 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
19ee0 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
19ef0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
19f00 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
19f10 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
19f20 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
19f30 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
19f40 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
19f50 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
19f60 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
19f70 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
19f80 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
19f90 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
19fa0 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
19fb0 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
19fc0 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
19fd0 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
19fe0 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
19ff0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1a000 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1a010 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
1a020 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1a030 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
1a040 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
1a050 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
1a060 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
1a070 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
1a080 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
1a090 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
1a0a0 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
1a0b0 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
1a0c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a0d0 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
1a0e0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
1a0f0 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
1a100 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
1a110 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
1a120 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
1a130 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
1a140 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1a150 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
1a160 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
1a170 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1a180 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
1a190 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
1a1a0 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
1a1b0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1a1c0 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
1a1d0 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
1a1e0 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
1a1f0 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
1a200 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
1a210 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
1a220 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
1a230 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
1a240 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
1a250 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
1a260 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
1a270 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
1a280 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
1a290 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
1a2a0 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
1a2b0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
1a2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
1a2d0 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
1a2e0 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69 54 61  op */ .  int iTa
1a2f0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  b = 0;         /
1a300 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  * Index to use *
1a310 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78  /..  pLeft = pEx
1a320 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28  pr->pLeft;.  if(
1a330 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
1a340 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  kIN(pParse, pExp
1a350 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  r) ) return;.  z
1a360 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69  Aff = exprINAffi
1a370 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
1a380 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d  pr);.  nVector =
1a390 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1a3a0 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
1a3b0 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20  eft);.  aiMap = 
1a3c0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d  (int*)sqlite3DbM
1a3d0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20  allocZero(.     
1a3e0 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65   pParse->db, nVe
1a3f0 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74  ctor*(sizeof(int
1a400 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29  ) + sizeof(char)
1a410 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28  ) + 1.  );.  if(
1a420 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a430 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
1a440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a450 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20  IN_oom_error;.. 
1a460 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63   /* Attempt to c
1a470 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
1a480 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
1a490 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   if anything oth
1a4a0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f  er than.  ** IN_
1a4b0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
1a4c0 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c  turned, the tabl
1a4d0 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 63 75  e opened with cu
1a4e0 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a 20 63  rsor iTab.  ** c
1a4f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
1a500 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
1a510 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
1a520 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
1a530 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
1a540 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
1a550 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
1a560 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1a570 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
1a580 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
1a590 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
1a5a0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
1a5b0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
1a5c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
1a5d0 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
1a5e0 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
1a5f0 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
1a600 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
1a630 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
1a640 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
1a670 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1a680 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
1a690 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20 20 20  HasNull,.       
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26 69 54        aiMap, &iT
1a6c0 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ab);..  assert( 
1a6d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1a6e0 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
1a6f0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
1a700 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
1a710 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
1a720 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
1a730 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
1a740 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
1a750 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a760 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
1a770 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
1a780 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
1a790 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1a7a0 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
1a7b0 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
1a7c0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1a7d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
1a7e0 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
1a7f0 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
1a800 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
1a810 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
1a820 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
1a830 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
1a840 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
1a850 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
1a860 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
1a870 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
1a880 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
1a890 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
1a8a0 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
1a8b0 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
1a8c0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1a8d0 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
1a8e0 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
1a8f0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
1a900 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
1a910 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
1a920 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
1a930 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
1a940 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
1a950 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
1a960 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
1a970 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
1a980 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
1a990 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
1a9a0 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
1a9b0 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
1a9c0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
1a9d0 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
1a9e0 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
1a9f0 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c 68 73  dex..  */.  rLhs
1aa00 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
1aa10 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
1aa20 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
1aa30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1aa40 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
1aa50 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
1aa60 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
1aa70 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
1aa80 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
1aa90 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
1aaa0 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
1aab0 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
1aac0 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
1aad0 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
1aae0 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
1aaf0 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
1ab00 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
1ab10 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
1ab20 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1ab30 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
1ab40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ab50 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1ab60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ab70 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
1ab80 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
1ab90 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
1aba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1abb0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
1abc0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
1abd0 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
1abe0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
1abf0 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
1ac00 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
1ac10 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
1ac20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
1ac30 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
1ac40 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
1ac50 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
1ac60 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
1ac70 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
1ac80 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
1ac90 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
1aca0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1acb0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
1acc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1acd0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ace0 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
1acf0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1ad00 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1ad10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
1ad20 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
1ad30 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
1ad40 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1ad50 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65  ;.    int r2, re
1ad60 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74  gToFree;.    int
1ad70 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a   regCkNull = 0;.
1ad80 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1ad90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ada0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1adb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1adc0 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
1add0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1ade0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
1adf0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
1ae00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1ae10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ae20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1ae30 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68  itAnd, rLhs, rLh
1ae40 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  s, regCkNull);. 
1ae50 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1ae60 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
1ae70 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1ae80 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ae90 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1aea0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
1aeb0 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
1aec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
1aed0 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
1aee0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1aef0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1af00 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1af10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1af20 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
1af30 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
1af40 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
1af50 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
1af60 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
1af70 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1af80 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1af90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1afa0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
1afb0 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32  Lhs, labelOk, r2
1afc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1afe0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1aff0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
1b000 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1b010 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
1b020 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
1b030 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
1b040 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
1b050 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1b060 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1b070 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
1b080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b090 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
1b0a0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1b0b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
1b0c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b0d0 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64  , OP_Ne, rLhs, d
1b0e0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1b110 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1b120 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
1b130 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
1b140 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1b150 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
1b160 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1b170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b180 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b190 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b1a0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
1b1b0 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
1b1c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1b1d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b1e0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
1b1f0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
1b200 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1b210 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1b220 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1b230 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1b240 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1b250 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b260 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
1b270 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b280 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b290 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74  CkNull);.    got
1b2a0 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1b2b0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1b2c0 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20  }..  /* Step 2: 
1b2d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1b2e0 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73  the LHS contains
1b2f0 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   any NULL column
1b300 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
1b310 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  LHS does contain
1b320 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20   NULLs then the 
1b330 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65  result must be e
1b340 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e  ither FALSE or N
1b350 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ULL..  ** We wil
1b360 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  l then skip the 
1b370 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
1b380 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1b390 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
1b3a0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1b3b0 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
1b3c0 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1b3d0 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74  else{.    destSt
1b3e0 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20  ep2 = destStep6 
1b3f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b400 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
1b410 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b420 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1b430 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
1b440 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1b450 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
1b460 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Left, i);.    if
1b470 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
1b480 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
1b490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b4a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1b4b0 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53  l, rLhs+i, destS
1b4c0 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62  tep2);.      Vdb
1b4d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b4e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
1b4f0 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69  ep 3.  The LHS i
1b500 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62  s now known to b
1b510 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20  e non-NULL.  Do 
1b520 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1b530 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  h.  ** of the RH
1b540 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20  S using the LHS 
1b550 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20  as a probe.  If 
1b560 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c  found, the resul
1b570 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a  t is.  ** true..
1b580 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1b590 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1b5a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
1b5b0 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
1b5c0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
1b5d0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
1b5e0 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20  d so we also.   
1b5f0 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   ** know that th
1b600 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c  e RHS is non-NUL
1b610 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f  L.  Hence, we co
1b620 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e  mbine steps 3 an
1b630 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  d 4.    ** into 
1b640 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
1b650 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1b660 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b670 53 65 65 6b 52 6f 77 69 64 2c 20 69 54 61 62 2c  SeekRowid, iTab,
1b680 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c   destIfFalse, rL
1b690 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  hs);.    VdbeCov
1b6a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
1b6b0 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1b6c0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1b6d0 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52   OP_Goto);  /* R
1b6e0 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20  eturn True */.  
1b6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1b700 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b710 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68  OP_Affinity, rLh
1b720 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a  s, nVector, 0, z
1b730 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  Aff, nVector);. 
1b740 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c     if( destIfFal
1b750 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
1b760 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  {.      /* Combi
1b770 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74  ne Step 3 and St
1b780 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67  ep 5 into a sing
1b790 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  le opcode */.   
1b7a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b7b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
1b7c0 74 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 64 65  tFound, iTab, de
1b7d0 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b800 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b810 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
1b820 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1b830 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1b840 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
1b850 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
1b860 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
1b870 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
1b880 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
1b890 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1b8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b8b0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
1b8c0 2c 20 69 54 61 62 2c 20 30 2c 0a 20 20 20 20 20  , iTab, 0,.     
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
1b900 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b910 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1b920 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20   4.  If the RHS 
1b930 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  is known to be n
1b940 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64  on-NULL and we d
1b950 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a  id not find.  **
1b960 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65   an match on the
1b970 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74   search above, t
1b980 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1b990 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20  ust be FALSE..  
1b9a0 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73  */.  if( rRhsHas
1b9b0 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d  Null && nVector=
1b9c0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
1b9d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b9e0 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
1b9f0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
1ba00 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
1ba10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1ba20 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66    /* Step 5.  If
1ba30 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1ba40 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72  about the differ
1ba50 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c  ence between NUL
1ba60 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45  L and.  ** FALSE
1ba70 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1ba80 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a  rn false. .  */.
1ba90 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
1baa0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20  e==destIfNull ) 
1bab0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1bac0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1bad0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c  ..  /* Step 6: L
1bae0 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73  oop through rows
1baf0 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f   of the RHS.  Co
1bb00 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74  mpare each row t
1bb10 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20  o the LHS..  ** 
1bb20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  If any compariso
1bb30 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
1bb40 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
1bb50 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a  LL.  If all.  **
1bb60 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
1bb70 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20   FALSE then the 
1bb80 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20  final result is 
1bb90 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  FALSE..  **.  **
1bba0 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48   For a scalar LH
1bbb0 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69  S, it is suffici
1bbc0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73  ent to check jus
1bbd0 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  t the first row.
1bbe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e    ** of the RHS.
1bbf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1bc00 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56  Step6 ) sqlite3V
1bc10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bc20 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20  v, destStep6);. 
1bc30 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
1bc40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bc50 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1bc60 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1bc70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bc80 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
1bc90 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74  1 ){.    destNot
1bca0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1bcb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1bcc0 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  se);.  }else{.  
1bcd0 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72    /* For nVector
1bce0 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65  ==1, combine ste
1bcf0 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d  ps 6 and 7 by im
1bd00 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
1bd10 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45  ing.    ** FALSE
1bd20 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   if the first co
1bd30 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
1bd40 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74  NULL */.    dest
1bd50 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66  NotNull = destIf
1bd60 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72  False;.  }.  for
1bd70 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1bd80 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1bd90 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  *p;.    CollSeq 
1bda0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
1bdb0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
1bdc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1bdd0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
1bde0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1bdf0 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
1be00 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1be10 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1be20 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  se, p);.    sqli
1be30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1be40 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
1be50 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71  , i, r3);.    sq
1be60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1be70 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69  v, OP_Ne, rLhs+i
1be80 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72  , destNotNull, r
1be90 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1bea0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1beb0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1bec0 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  Q);.    VdbeCove
1bed0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1bee0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1bef0 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
1bf00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1bf10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1bf20 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
1bf30 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  l);.  if( nVecto
1bf40 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
1bf50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1bf60 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  el(v, destNotNul
1bf70 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1bf80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bf90 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
1bfa0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65  Top+1);.    Vdbe
1bfb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1bfc0 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66    /* Step 7:  If
1bfd0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1bfe0 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
1bff0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  at the result mu
1c000 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c  st.    ** be fal
1c010 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  se. */.    sqlit
1c020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c030 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1c040 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20  IfFalse);.  }.. 
1c050 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69   /* Jumps here i
1c060 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72  n order to retur
1c070 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c  n true. */.  sql
1c080 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1c090 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29  (v, addrTruthOp)
1c0a0 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ;..sqlite3ExprCo
1c0b0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  deIN_finished:. 
1c0c0 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f   if( rLhs!=rLhsO
1c0d0 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  rig ) sqlite3Rel
1c0e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c0f0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64 62  se, rLhs);.  Vdb
1c100 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
1c110 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71  d IN expr"));.sq
1c120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1c130 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  oom_error:.  sql
1c140 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1c150 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20  e->db, aiMap);. 
1c160 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1c170 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29  Parse->db, zAff)
1c180 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1c190 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c1a0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
1c1b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1c1c0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
1c1d0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1c1e0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1c1f0 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
1c200 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
1c210 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
1c220 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1c230 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1c240 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
1c250 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
1c260 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
1c270 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
1c280 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
1c290 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
1c2a0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
1c2b0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
1c2c0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
1c2d0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
1c2e0 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
1c2f0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1c300 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
1c310 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1c320 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
1c330 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
1c340 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
1c350 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
1c360 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
1c370 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
1c380 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
1c390 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
1c3a0 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
1c3b0 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
1c3c0 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
1c3d0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
1c3e0 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
1c3f0 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
1c400 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73   = -value;.    s
1c410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c420 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  Dup8(v, OP_Real,
1c430 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
1c440 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41  *)&value, P4_REA
1c450 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
1c460 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1c470 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c480 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c490 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
1c4a0 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
1c4b0 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1c4c0 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1c4d0 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
1c4e0 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
1c4f0 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
1c500 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1c510 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
1c520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c530 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c540 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
1c550 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
1c560 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1c570 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1c580 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1c590 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
1c5a0 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
1c5b0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
1c5c0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
1c5d0 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
1c5e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c5f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c600 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
1c610 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
1c620 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
1c630 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c640 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
1c650 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
1c660 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
1c670 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1c680 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29  ToI64(z, &value)
1c690 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20  ;.    if( (c==3 
1c6a0 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20  && !negFlag) || 
1c6b0 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c  (c==2) || (negFl
1c6c0 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
1c6d0 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
1c6e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1c6f0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1c700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1c710 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c720 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
1c730 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
1c740 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
1c750 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
1c760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
1c770 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
1c780 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
1c790 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
1c7a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c7b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c7c0 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
1c7d0 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
1c7e0 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
1c7f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
1c800 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1c810 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c820 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
1c830 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
1c840 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1c850 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
1c860 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33   ){ value = c==3
1c870 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
1c880 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
1c890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c8a0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1c8b0 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
1c8c0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1c8d0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
1c8e0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1c8f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c900 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
1c910 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
1c920 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
1c930 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1c940 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
1c950 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
1c960 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
1c970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
1c980 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
1c990 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c9a0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1c9b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1c9c0 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
1c9d0 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
1c9e0 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
1c9f0 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
1ca00 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
1ca10 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1ca20 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
1ca30 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
1ca40 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1ca50 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
1ca60 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1ca70 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1ca80 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
1ca90 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
1caa0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1cab0 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
1cac0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
1cad0 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
1cae0 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e   if( iTabCol==XN
1caf0 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73  _EXPR ){.    ass
1cb00 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1cb10 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
1cb20 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1cb30 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c  r->nExpr>iIdxCol
1cb40 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1cb50 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43  iSelfTab = iTabC
1cb60 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69  ur + 1;.    sqli
1cb70 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
1cb80 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43  pParse, pIdx->aC
1cb90 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f  olExpr->a[iIdxCo
1cba0 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74  l].pExpr, regOut
1cbb0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
1cbc0 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d  SelfTab = 0;.  }
1cbd0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1cbe0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1cbf0 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1cc00 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1cc10 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1cc50 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1cc60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cc70 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1cc80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1cc90 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1cca0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1ccb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ccc0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1ccd0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1cce0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1ccf0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1cd00 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1cd10 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1cd20 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1cd30 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1cd40 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1cd50 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1cd60 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1cd70 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1cd80 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1cd90 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1cda0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1cdb0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1cdc0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1cdd0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1cde0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1cdf0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1ce00 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
1ce10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1ce20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1ce30 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69  lumn, iTabCur, i
1ce40 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1ce50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ce60 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
1ce70 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
1ce80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ce90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1cea0 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
1ceb0 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1cec0 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
1ced0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
1cee0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
1cef0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20  Column;.    int 
1cf00 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66  x = iCol;.    if
1cf10 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
1cf20 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
1cf30 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78  pTab) ){.      x
1cf40 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1cf50 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50  OfIndex(sqlite3P
1cf60 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1cf70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Tab), iCol);.   
1cf80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1cf90 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1cfa0 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f  iTabCur, x, regO
1cfb0 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ut);.  }.  if( i
1cfc0 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Col>=0 ){.    sq
1cfd0 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
1cfe0 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
1cff0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1d000 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d010 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1d020 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
1d030 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
1d040 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
1d050 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
1d060 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1d070 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a 2a  egister iReg. .*
1d080 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1d090 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
1d0a0 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
1d0b0 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
1d0c0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1d0d0 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
1d0e0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
1d0f0 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
1d100 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
1d110 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d120 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d130 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1d140 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
1d150 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d160 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1d180 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1d190 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
1d1a0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
1d1b0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
1d1c0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
1d1d0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
1d1e0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
1d1f0 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1d200 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
1d210 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
1d220 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
1d230 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
1d240 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
1d250 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
1d260 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
1d270 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c  r OP_Column + FL
1d280 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  AGS */.){.  Vdbe
1d290 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d2a0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
1d2b0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1d2c0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d2d0 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
1d2e0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1d2f0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
1d300 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
1d310 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d320 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   p5);.  }.  retu
1d330 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
1d340 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d350 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d360 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d370 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d380 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d390 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
1d3a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d3b0 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1d3c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1d3d0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1d3e0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1d3f0 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1d400 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1d410 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1d420 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1d430 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1d440 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1d450 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , nReg);.}../*.*
1d460 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1d470 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1d480 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1d490 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1d4a0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1d4b0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1d4c0 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1d4d0 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1d4e0 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1d4f0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1d500 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1d510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1d520 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1d530 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1d540 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1d550 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1d560 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1d570 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1d580 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1d590 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1d5a0 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1d5b0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1d5c0 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1d5d0 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1d5e0 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1d5f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1d600 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1d610 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1d620 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1d630 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1d640 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1d650 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1d660 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1d670 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1d680 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1d690 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1d6a0 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1d6b0 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1d6c0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1d6d0 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1d6e0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1d6f0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1d700 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1d710 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1d720 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1d730 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1d740 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1d750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1d760 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1d770 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d780 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1d790 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1d7a0 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1d7b0 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1d7c0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1d7d0 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1d7e0 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1d7f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d800 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1d810 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1d820 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1d830 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1d840 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1d850 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49  LECT ){.#if SQLI
1d860 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1d870 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d880 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   0;.#else.      
1d890 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1d8a0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1d8b0 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64 69  Parse, p);.#endi
1d8c0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1d8d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1d8e0 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65  iResult = pParse
1d8f0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1d900 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1d910 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66  nResult;.      f
1d920 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
1d930 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1d940 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d950 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73  Factorable(pPars
1d960 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  e, p->x.pList->a
1d970 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65  [i].pExpr, i+iRe
1d980 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
1d990 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d9a0 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n iResult;.}.../
1d9b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d9c0 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
1d9d0 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
1d9e0 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
1d9f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
1da00 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
1da10 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
1da20 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
1da30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1da40 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
1da50 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1da60 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
1da70 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
1da80 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
1da90 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
1daa0 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
1dab0 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
1dac0 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
1dad0 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
1dae0 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
1daf0 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
1db00 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
1db10 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1db20 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
1db30 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
1db40 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
1db50 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
1db60 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
1db70 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1db80 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1db90 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1dba0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1dbb0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1dbc0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1dbd0 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
1dbe0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1dbf0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
1dc20 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1dc30 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
1dc40 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
1dc50 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
1dc60 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
1dc70 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1dc80 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
1dc90 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1dca0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1dcb0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1dcc0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1dcd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1dce0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1dcf0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1dd00 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1dd10 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20  1, r2;          
1dd20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
1dd30 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1dd40 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58   */.  Expr tempX
1dd50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd60 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70  /* Temporary exp
1dd70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a  ression node */.
1dd80 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20    int p5 = 0;.. 
1dd90 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1dda0 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1ddb0 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1ddc0 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
1ddd0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1dde0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ddf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1de00 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f  .  }..expr_code_
1de10 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45  doover:.  if( pE
1de20 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
1de30 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
1de40 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
1de50 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
1de60 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1de70 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
1de80 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
1de90 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1dea0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1deb0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
1dec0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1ded0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1dee0 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
1def0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
1df00 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1df10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1df20 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
1df30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1df40 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20  rn pCol->iMem;. 
1df50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1df60 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
1df70 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
1df80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df90 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1dfa0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
1dfb0 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dfe0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
1dff0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e000 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
1e020 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
1e030 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
1e040 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
1e050 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e060 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1e070 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78    int iTab = pEx
1e080 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1e090 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e0a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e0b0 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20  FixedCol) ){.   
1e0c0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f 4c       /* This COL
1e0d0 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  UMN expression i
1e0e0 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73 74  s really a const
1e0f0 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52 45  ant due to WHERE
1e100 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
1e110 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ** constraints, 
1e120 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61 6e  and that constan
1e130 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74 68  t is coded by th
1e140 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20  e pExpr->pLeft. 
1e150 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
1e160 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72 2c  ssion.  However,
1e170 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   make sure the c
1e180 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65 20  onstant has the 
1e190 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20 20  correct.        
1e1a0 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20 61  ** datatype by a
1e1b0 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66 69  pplying the Affi
1e1c0 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62 6c  nity of the tabl
1e1d0 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 0a  e column to the.
1e1e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1e1f0 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ant..        */.
1e200 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65 67          int iReg
1e210 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e220 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1e230 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74 61   pExpr->pLeft,ta
1e240 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
1e250 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  nt aff = sqlite3
1e260 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
1e270 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61  ity(pExpr->y.pTa
1e280 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  b, pExpr->iColum
1e290 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1e2a0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
1e2b0 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
1e2c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e2d0 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c  har zAff[] = "B\
1e2e0 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b  000C\000D\000E";
1e2f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e300 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  t( SQLITE_AFF_BL
1e310 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20  OB=='A' );.     
1e320 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1e330 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42  ITE_AFF_TEXT=='B
1e340 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ' );.          i
1e350 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20  f( iReg!=target 
1e360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e380 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
1e390 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1e3a0 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20           iReg = 
1e3b0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  target;.        
1e3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
1e3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e3e0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1e3f0 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20  iReg, 1, 0,.    
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61          &zAff[(a
1e420 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53  ff-'B')*2], P4_S
1e430 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1e440 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1e450 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20   iReg;.      }. 
1e460 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e470 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e480 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e4a0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e4b0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e4c0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e4d0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e4e0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e4f0 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e500 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e510 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e530 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e540 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e550 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e560 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e570 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e580 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e590 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e5a0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e5b0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e5c0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e5d0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e5e0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e600 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e610 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e620 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54  rse, pExpr->y.pT
1e630 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
1e660 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c  n, iTab, target,
1e670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
1e6a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1e6b0 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1e6c0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1e6d0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
1e6e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e6f0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e700 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1e710 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  UEFALSE: {.     
1e720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e730 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e740 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  , sqlite3ExprTru
1e750 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20  thValue(pExpr), 
1e760 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e770 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e780 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e790 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1e7a0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1e7b0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1e7c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e7d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e7e0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e7f0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1e800 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1e810 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1e820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e830 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1e840 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1e850 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1e860 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e870 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e880 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e8a0 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1e8b0 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1e8c0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65  Token);.      re
1e8d0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e8e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1e8f0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1e900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e910 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1e920 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e930 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e940 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e950 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1e960 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1e970 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1e980 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1e990 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1e9a0 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1e9b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e9c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e9d0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e9e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e9f0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ea00 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1ea10 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1ea20 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1ea30 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1ea40 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1ea50 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1ea60 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1ea70 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1ea80 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1ea90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1eaa0 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1eab0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1eac0 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1ead0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1eae0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1eaf0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1eb00 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1eb10 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1eb20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1eb30 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1eb40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1eb50 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1eb60 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1eb70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1eb80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1eb90 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1eba0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1ebb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1ebc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ebd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1ebe0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1ebf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ec00 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1ec10 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1ec20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1ec30 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1ec40 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1ec50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ec60 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  z = sqlite3VList
1ec70 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
1ec80 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d  ->pVList, pExpr-
1ec90 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1eca0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1ecb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1ecc0 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78  ?' || strcmp(pEx
1ecd0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29  pr->u.zToken, z)
1ece0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1ecf0 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d  Parse->pVList[0]
1ed00 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74   = 0; /* Indicat
1ed10 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c  e VList may no l
1ed20 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65  onger be enlarge
1ed30 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1ed40 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1ed50 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34  (v, (char*)z, P4
1ed60 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1ed70 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1ed80 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1ed90 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1eda0 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1edb0 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1edc0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1edd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1ede0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1edf0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1ee00 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1ee10 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1ee20 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1ee30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1ee40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ee50 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1ee60 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1ee70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1ee80 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1ee90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eea0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1eeb0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1eec0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1eed0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1eee0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1eef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ef00 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1ef10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ef30 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1ef40 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1ef50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ef60 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e  inReg;.    }.#en
1ef70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1ef80 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
1ef90 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1efa0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
1efb0 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1efc0 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1efd0 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d  K_NE;.      p5 =
1efe0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
1eff0 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68        /* fall-th
1f000 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
1f010 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f020 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f030 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f040 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f050 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f060 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f070 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1f080 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1f090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1f0a0 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74  prIsVector(pLeft
1f0b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) ){.        cod
1f0c0 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70  eVectorCompare(p
1f0d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f0e0 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20  rget, op, p5);. 
1f0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f100 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f110 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f120 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
1f130 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f140 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f150 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f160 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f170 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f180 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f190 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1f1a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f1b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31  ,.            r1
1f1c0 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
1f1d0 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35  ITE_STOREP2 | p5
1f1e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f1f0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f200 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f210 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f220 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f230 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f240 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1f250 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f260 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1f270 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1f280 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f290 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f2a0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f2b0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f2c0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f2d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f2e0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1f2f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f300 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1f310 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1f320 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f330 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1f340 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f350 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1f360 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1f370 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f380 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1f390 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f3a0 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1f3b0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1f3c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f3d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f3f0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f400 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1f410 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f420 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f430 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
1f450 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1f460 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
1f470 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
1f480 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
1f490 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
1f4a0 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
1f4b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1f4c0 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
1f4d0 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
1f4e0 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
1f4f0 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1f500 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f510 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
1f520 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
1f530 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
1f540 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1f550 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
1f560 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1f570 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f580 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
1f590 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
1f5a0 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
1f5b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f5c0 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
1f5d0 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
1f5e0 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
1f5f0 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
1f600 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
1f610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f620 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
1f630 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
1f640 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
1f650 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f660 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
1f670 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
1f680 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1f690 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
1f6a0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
1f6b0 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
1f6c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f6d0 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
1f6e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
1f6f0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
1f700 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
1f710 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
1f720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f730 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
1f740 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
1f750 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1f760 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1f770 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
1f780 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
1f790 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1f7a0 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
1f7b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f7c0 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
1f7d0 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
1f7e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
1f7f0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1f800 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f810 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f820 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f830 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1f840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f850 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f860 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1f870 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
1f880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f890 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
1f8a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
1f8b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f8c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f8d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f8e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f8f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f900 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1f910 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1f920 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1f930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f940 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
1f950 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1f960 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
1f970 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1f980 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
1f990 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f9a0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1f9b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f9c0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1f9d0 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
1f9e0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1f9f0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
1fa00 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1fa10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1fa20 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1fa30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
1fa40 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
1fa50 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
1fa60 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1fa70 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69  rn target;.#endi
1fa80 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1fa90 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
1faa0 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
1fab0 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
1fac0 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
1fad0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
1fae0 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
1faf0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
1fb00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fb10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fb20 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
1fb30 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1fb40 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1fb50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fb60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fb70 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fb90 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
1fba0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
1fbb0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
1fbc0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1fbd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1fbe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fbf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1fc00 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
1fc10 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
1fc20 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
1fc30 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
1fc40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fc50 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
1fc60 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
1fc70 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
1fc80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fc90 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
1fca0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fcb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fcc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fcd0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fce0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fcf0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1fd00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fd10 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
1fd20 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
1fd30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fd40 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
1fd50 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20      int isTrue; 
1fd60 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
1fd70 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
1fd80 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61        int bNorma
1fd90 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  l;   /* IS TRUE 
1fda0 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20  or IS FALSE */. 
1fdb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fdc0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fdd0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fde0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1fdf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1fe10 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
1fe20 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
1fe30 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
1fe40 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61  t);.      bNorma
1fe50 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  l = pExpr->op2==
1fe60 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73  TK_IS;.      tes
1fe70 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
1fe80 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fe90 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
1fea0 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1feb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fec0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1fed0 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52  _IsTrue, r1, inR
1fee0 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54  eg, !isTrue, isT
1fef0 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a  rue ^ bNormal);.
1ff00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ff10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ff20 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1ff30 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1ff40 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1ff50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1ff60 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1ff70 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1ff80 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1ff90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ffa0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1ffb0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1ffc0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1ffd0 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1ffe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fff0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
20000 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
20010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20020 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20030 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20040 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20050 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20060 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
20070 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
20080 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
20090 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
200a0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
200b0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
200c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
200d0 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
200e0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
200f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20100 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
20110 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
20120 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
20130 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
20140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20150 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
20160 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20170 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
20180 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
20190 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
201a0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
201b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
201c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
201d0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
201e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
201f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20200 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
20210 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
20220 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
20230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20240 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
20250 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
20260 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
20270 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20280 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20290 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
202a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
202b0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
202c0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
202d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
202e0 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
202f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20300 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
20310 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
20320 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
20330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20340 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
20350 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
20360 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20370 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
20380 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
20390 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
203a0 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
203b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
203c0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
203d0 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
203e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20410 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20420 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20430 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
20440 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
20450 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
20460 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
20470 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
20480 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
20490 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
204a0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
204b0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
204c0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
204d0 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
204e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
204f0 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
20500 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20510 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
20520 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
20530 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  urn pExpr->y.pWi
20540 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20  n->regResult;.  
20550 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20560 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63      if( ConstFac
20570 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26  torOk(pParse) &&
20580 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20590 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
205a0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
205b0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
205c0 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
205d0 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76  e. So try to mov
205e0 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74  e constant funct
205f0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ions.        ** 
20600 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
20610 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74   loop, even if t
20620 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74  hat means an ext
20630 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20  ra OP_Copy. */. 
20640 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20650 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
20660 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
20670 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  r, -1);.      }.
20680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
20690 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
206a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
206b0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
206c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
206d0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
206e0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
206f0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
20700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20710 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
20720 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
20730 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
20740 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
20750 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
20760 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20770 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20780 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20790 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
207a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
207b0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
207c0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
207d0 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
207e0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
207f0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
20800 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
20810 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
20820 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70  0 && pParse->exp
20830 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
20840 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20850 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  ndFunction(db, "
20860 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c  unknown", nFarg,
20870 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
20880 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20890 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
208a0 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
208b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
208c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
208d0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
208e0 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49  ction: %s()", zI
208f0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
20900 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20910 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
20920 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
20930 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
20940 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
20950 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
20960 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
20970 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
20980 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
20990 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
209a0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
209b0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
209c0 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
209d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
209e0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
209f0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
20a00 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
20a10 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
20a20 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
20a30 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
20a40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20a50 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
20a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20a70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
20a80 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20a90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20aa0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
20ab0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ad0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
20ae0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
20af0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
20b00 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20b10 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
20b30 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20b40 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
20b50 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
20b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20b70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20b80 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
20b90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20ba0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20bb0 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
20bc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20bd0 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
20be0 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
20bf0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
20c00 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
20c10 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20c20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20c30 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
20c40 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
20c50 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20c60 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
20c70 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20c80 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20c90 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
20ca0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20cb0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
20cc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20cd0 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
20ce0 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
20cf0 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
20d00 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
20d10 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
20d20 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
20d30 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
20d40 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
20d50 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
20d60 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
20d70 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
20d80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20d90 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20da0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
20db0 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
20dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
20dd0 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
20de0 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
20df0 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
20e00 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
20e10 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
20e20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
20e30 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
20e40 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
20e50 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
20e60 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
20e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
20e80 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
20e90 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b      aff ? azAff[
20ec0 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  aff-SQLITE_AFF_B
20ed0 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a  LOB] : "none");.
20ee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
20ef0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23  arget;.      }.#
20f00 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72  endif..      for
20f10 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
20f20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
20f30 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
20f40 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
20f50 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
20f70 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
20f80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
20f90 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
20fa0 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
20fb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20fc0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20fd0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
20fe0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
20ff0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
21000 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21010 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
21020 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
21030 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
21040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21050 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
21060 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
21070 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
21080 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
21090 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
210a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
210b0 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
210c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
210d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
210e0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
210f0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
21100 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
21110 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
21120 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
21130 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
21140 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
21150 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
21160 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
21170 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
21180 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
21190 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
211a0 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
211b0 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
211c0 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
211d0 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
211e0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
211f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21200 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
21210 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
21220 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
21230 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
21240 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
21250 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
21260 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21270 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
21280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
21290 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
212a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
212b0 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
212c0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
212d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
212e0 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
212f0 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
21300 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
21310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21320 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
21330 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
21340 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
21350 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
21360 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
21370 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
21380 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21390 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
213a0 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
213b0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
213c0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
213d0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
213e0 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
213f0 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
21400 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
21410 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
21420 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
21430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21440 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
21450 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21460 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21470 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
214a0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
214b0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
214c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
214d0 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
214e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
214f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
21500 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
21510 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
21520 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
21530 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
21540 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
21550 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21560 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
21570 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
21580 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
21590 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
215a0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
215b0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
215c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
215d0 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
215e0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
215f0 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
21600 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
21610 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
21620 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
21630 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
21640 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
21650 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
21660 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
21670 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
21680 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
21690 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
216a0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
216b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
216c0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
216d0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
216e0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
216f0 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
21700 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
21710 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
21720 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
21730 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
21740 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
21750 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
21760 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
21770 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
21780 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
21790 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
217a0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
217b0 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  >=2 && ExprHasPr
217c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
217d0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
217e0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
217f0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21800 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21810 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21820 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
21830 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
21840 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
21850 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
21860 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
21870 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
21880 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
21890 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
218a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
218b0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
218c0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
218d0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
218e0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
218f0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
21900 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
21910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21920 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
21930 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
21940 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
21950 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
21960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21970 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
21980 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70  FUNC.      if( p
21990 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
219a0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46   SQLITE_FUNC_OFF
219b0 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45  SET ){.        E
219c0 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72  xpr *pArg = pFar
219d0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  g->a[0].pExpr;. 
219e0 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
219f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21a10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21a20 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67   OP_Offset, pArg
21a30 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e  ->iTable, pArg->
21a40 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
21a50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21a60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21a70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21a80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
21a90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
21aa0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21ab0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
21ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21ad0 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69  Op4(v, pParse->i
21ae0 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72  SelfTab ? OP_Pur
21af0 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63  eFunc0 : OP_Func
21b00 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20  tion0,.         
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
21b30 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70  target, (char*)p
21b40 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
21b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21b60 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21b70 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
21b80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21b90 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
21ba0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
21bb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21bc0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21bd0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
21be0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21bf0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21c00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21c10 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
21c20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
21c30 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21c40 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
21c50 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
21c60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
21c70 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
21c80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
21c90 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21ca0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21cb0 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
21cc0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
21cd0 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
21ce0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21cf0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
21d00 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
21d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21d20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
21d30 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21d40 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21d70 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
21d80 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21d90 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66   int n;.      if
21da0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ( pExpr->pLeft->
21db0 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  iTable==0 ){.   
21dc0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
21dd0 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  t->iTable = sqli
21de0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
21df0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21e00 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
21e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
21e20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
21e30 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
21e40 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21e50 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21e60 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
21e70 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
21e80 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
21e90 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
21ea0 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
21eb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
21ec0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21ed0 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
21ee0 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
21ef0 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
21f20 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
21f30 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
21f40 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
21f50 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
21f60 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
21f70 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
21f80 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
21f90 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
21fa0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
21fb0 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  e);.      int de
21fc0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
21fd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21fe0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
21ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22000 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
22010 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22020 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
22030 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22040 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
22050 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
22060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22070 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22080 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
22090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
220a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
220b0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
220c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
220d0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
220e0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
220f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22100 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
22110 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
22120 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
22130 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
22140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
22150 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
22160 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
22170 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
22180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
22190 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
221a0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
221b0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
221c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
221d0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
221e0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
221f0 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
22200 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22210 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
22220 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
22230 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22240 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
22250 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
22260 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
22270 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
22280 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22290 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20  arget, 0, 0);.  
222a0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
222b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
222c0 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
222d0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
222e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
222f0 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70  US: {.      pExp
22300 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  r = pExpr->pLeft
22310 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70  ;.      goto exp
22320 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20 2f  r_code_doover; /
22330 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50 72  * 2018-04-28: Pr
22340 65 76 65 6e 74 20 64 65 65 70 20 72 65 63 75 72  event deep recur
22350 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20 2a  sion. OSSFuzz. *
22360 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  /.    }..    cas
22370 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
22380 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
22390 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
223a0 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
223b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
223c0 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
223d0 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
223e0 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
223f0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22400 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
22410 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
22420 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
22430 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
22440 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
22450 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
22460 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
22470 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
22480 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
22490 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
224a0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
224b0 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
224c0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
224d0 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
224e0 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
224f0 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
22500 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a   field..      **
22510 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78  .      ** The ex
22520 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c  pression is impl
22530 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e  emented using an
22540 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65   OP_Param opcode
22550 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a  . The p1.      *
22560 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  * parameter is s
22570 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f  et to 0 for an o
22580 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ld.rowid referen
22590 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a  ce, or to (i+1).
225a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65        ** to refe
225b0 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f  rence another co
225c0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e  lumn of the old.
225d0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
225e0 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  where .      ** 
225f0 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  i is the index o
22600 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f  f the column. Fo
22610 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65  r a new.rowid re
22620 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20  ference, p1 is. 
22630 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28       ** set to (
22640 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73  n+1), where n is
22650 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
22660 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70  olumns in each p
22670 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20  seudo-table..   
22680 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65     ** For a refe
22690 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68  rence to any oth
226a0 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  er column in the
226b0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
226c0 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a  ble, p1.      **
226d0 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b   is set to (n+2+
226e0 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20  i), where n and 
226f0 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64  i are as defined
22700 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72   previously. For
22710 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  .      ** exampl
22720 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
22730 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72  on which trigger
22740 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65  s are being fire
22750 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  d is.      ** de
22760 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20  clared as:.     
22770 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43   **.      **   C
22780 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
22790 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20  , b);.      **. 
227a0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20       ** Then p1 
227b0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
227c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
227d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70   **.      **   p
227e0 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==0   ->    old
227f0 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33  .rowid     p1==3
22800 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77     ->    new.row
22810 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  id.      **   p1
22820 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==1   ->    old.
22830 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20  a         p1==4 
22840 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20    ->    new.a.  
22850 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20      **   p1==2  
22860 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20   ->    old.b    
22870 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20       p1==5   -> 
22880 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a     new.b       .
22890 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
228a0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
228b0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
228c0 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
228d0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
228e0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
228f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
22900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22910 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
22920 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
22930 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
22940 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
22950 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
22960 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
22970 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
22980 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
22990 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
229a0 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
229b0 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
229c0 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
229d0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
229e0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
229f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22a00 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
22a10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
22a20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 5b  eComment((v, "r[
22a30 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72 67  %d]=%s.%s", targ
22a40 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  et,.        (pEx
22a50 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
22a60 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
22a70 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
22a80 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
22a90 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   : pExpr->y.pTab
22aa0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22ab0 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20  olumn].zName).  
22ac0 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
22ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
22ae0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
22af0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
22b00 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
22b10 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
22b20 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
22b30 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
22b40 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
22b50 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
22b60 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
22b70 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
22b80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
22b90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
22ba0 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
22bb0 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
22bc0 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
22bd0 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
22be0 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
22bf0 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
22c00 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
22c10 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
22c20 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
22c30 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
22c40 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
22c50 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
22c60 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
22c70 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
22c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22c90 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
22ca0 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
22cb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22cd0 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
22ce0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
22cf0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22d00 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
22d10 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
22d20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
22d30 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
22d40 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ROW: {.      in
22d50 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20  t addrINR;.     
22d60 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74   addrINR = sqlit
22d70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
22d80 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45  OP_IfNullRow, pE
22d90 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
22da0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
22db0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
22dc0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
22dd0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
22de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22df0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
22e00 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71  drINR);.      sq
22e10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22e20 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e  3(v, addrINR, in
22e30 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
22e40 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
22e50 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
22e60 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
22e70 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
22e80 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
22e90 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
22ea0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22eb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
22ec0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
22ed0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
22ee0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
22ef0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
22f00 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
22f10 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
22f20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
22f30 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
22f40 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
22f50 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
22f60 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
22f70 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
22f80 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
22f90 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
22fa0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
22fb0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22fc0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22fd0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
22fe0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
22ff0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
23000 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
23010 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
23020 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
23030 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
23040 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
23050 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
23060 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
23070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
23080 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
23090 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
230a0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
230b0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
230c0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
230d0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
230e0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
230f0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
23100 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
23110 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
23120 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23130 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
23140 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
23150 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
23160 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
23170 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
23180 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
23190 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
231a0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
231b0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
231c0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
231d0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
231e0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
231f0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
23200 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
23230 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
23240 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
23250 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
23280 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
23290 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
232a0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
232d0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
232e0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23310 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
23320 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
23350 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
23360 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23370 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
23380 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
23390 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
233a0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
233b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
233c0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
233d0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
233e0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
23410 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
23420 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
23430 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23440 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
23450 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
23460 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a  Ei (form B) */..
23470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23480 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23490 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
234a0 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
234b0 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
234c0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
234d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
234e0 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
234f0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
23500 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
23510 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
23520 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
23530 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
23540 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
23550 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
23560 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23570 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
23580 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
23590 20 20 20 20 20 20 65 78 70 72 4e 6f 64 65 43 6f        exprNodeCo
235a0 70 79 28 26 74 65 6d 70 58 2c 20 70 58 29 3b 0a  py(&tempX, pX);.
235b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
235c0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
235d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
235e0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
235f0 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
23600 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
23610 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
23620 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23630 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23640 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23650 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
23660 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
23670 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
23680 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
23690 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
236a0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
236b0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
236c0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
236d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
236e0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
236f0 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23700 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23710 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23720 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23730 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23740 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23750 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23760 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23770 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
23780 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23790 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
237a0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
237b0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
237c0 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
237d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
237e0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
237f0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
23800 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
23810 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
23820 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
23830 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
23840 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
23850 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
23860 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23870 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
23880 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
23890 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
238a0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
238b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
238c0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
238d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
238e0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  se);.        tes
238f0 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
23900 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23920 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23930 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
23940 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
23950 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
23960 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23970 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
23980 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
239a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
239b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
239c0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
239d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
239e0 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
239f0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23a00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23a10 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
23a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23a30 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
23a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23a50 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23a60 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23a70 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23a80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
23a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23ab0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
23ac0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
23ad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ae0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23af0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
23b00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
23b10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23b20 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
23b30 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
23b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
23b50 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23b60 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
23b70 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23b80 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
23b90 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
23ba0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23bb0 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
23bc0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
23bd0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
23be0 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
23bf0 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
23c00 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
23c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23c20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
23c50 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
23c60 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
23c70 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
23c80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23c90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23ca0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23cb0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
23cc0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
23cd0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
23ce0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
23cf0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23d00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
23d10 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23d20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
23d30 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
23d40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23d50 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
23d60 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
23d70 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
23d80 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
23d90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
23da0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
23db0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
23dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23dd0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
23de0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
23df0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e00 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
23e30 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
23e40 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
23e50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23e60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
23e70 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
23e80 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23e90 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
23ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
23eb0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23ec0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
23ed0 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
23ee0 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
23ef0 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
23f00 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
23f10 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
23f20 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  tion time..**.**
23f30 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74   If regDest>=0 t
23f40 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
23f50 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
23f60 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
23f70 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75   and the.** resu
23f80 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62  lt is not reusab
23f90 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c  le.  If regDest<
23fa0 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
23fb0 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a  ine is free to .
23fc0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  ** store the val
23fd0 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20  ue whereever it 
23fe0 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  wants.  The regi
23ff0 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65  ster where the e
24000 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73  xpression .** is
24010 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72   stored is retur
24020 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65  ned.  When regDe
24030 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69  st<0, two identi
24040 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  cal expressions 
24050 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  will.** code to 
24060 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
24070 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
24080 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
24090 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
240a0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
240b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
240c0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
240d0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
240e0 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
240f0 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
24100 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
24110 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  est       /* Sto
24120 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
24130 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
24140 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
24150 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
24160 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24170 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
24180 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
24190 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
241a0 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  && p ){.    stru
241b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
241c0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74   *pItem;.    int
241d0 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   i;.    for(pIte
241e0 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
241f0 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
24200 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  , i--){.      if
24210 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
24220 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
24230 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d  Compare(0,pItem-
24240 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
24250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
24260 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69  eturn pItem->u.i
24270 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20  ConstExprReg;.  
24280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24290 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
242a0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
242b0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
242c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
242d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
242e0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
242f0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
24300 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24310 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
24320 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
24330 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
24340 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30  able = regDest<0
24350 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65  ;.     if( regDe
24360 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d  st<0 ) regDest =
24370 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
24380 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
24390 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
243a0 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50  egDest;.  }.  pP
243b0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
243c0 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72   = p;.  return r
243d0 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egDest;.}../*.**
243e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
243f0 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
24400 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
24410 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
24420 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
24430 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
24440 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
24450 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
24460 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
24470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
24480 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
24490 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
244a0 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
244b0 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
244c0 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
244d0 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
244e0 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
244f0 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
24500 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
24510 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
24520 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
24530 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
24540 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24550 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
24560 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
24570 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
24580 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
24590 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
245a0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
245b0 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
245c0 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
245d0 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
245e0 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
245f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
24600 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
24610 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24620 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
24630 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
24640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
24650 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
24660 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
24670 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
24680 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
24690 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
246a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
246b0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
246c0 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  xpr).  ){.    *p
246d0 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32  Reg  = 0;.    r2
246e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
246f0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24700 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d   pExpr, -1);.  }
24710 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
24720 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
24730 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
24740 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24750 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
24760 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
24770 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
24780 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
24790 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
247a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
247b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
247c0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
247d0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
247e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
247f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24800 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
24810 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
24820 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
24830 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
24840 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
24850 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
24860 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
24870 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
24880 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
24890 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
248a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
248b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
248c0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
248d0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
248e0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
248f0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
24900 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
24910 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
24920 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
24930 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
24940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24950 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
24960 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
24970 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
24980 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24990 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
249a0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
249b0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
249c0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
249d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
249e0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
249f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24a00 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
24a10 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
24a20 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
24a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24a40 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24a50 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
24a60 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
24a70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
24a80 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
24a90 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
24aa0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
24ab0 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
24ac0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
24ad0 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
24ae0 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
24af0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
24b00 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
24b10 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
24b20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
24b30 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
24b40 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
24b50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b60 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
24b70 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24b80 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24b90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24ba0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
24bb0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
24bc0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
24bd0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
24be0 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
24bf0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24c00 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24c10 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
24c20 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
24c30 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
24c40 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
24c50 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
24c60 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
24c70 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
24c80 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
24c90 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
24ca0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
24cb0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
24cc0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
24cd0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
24ce0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
24cf0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
24d00 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
24d10 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
24d20 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
24d30 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
24d40 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
24d50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24d60 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
24d70 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24d80 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24d90 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
24da0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
24db0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
24dc0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
24dd0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
24de0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24df0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24e00 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
24e10 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
24e20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24e30 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24e40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
24e50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24e60 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
24e70 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
24e80 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
24e90 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
24ea0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
24eb0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
24ec0 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
24ed0 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
24ee0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
24ef0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
24f00 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
24f10 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
24f20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
24f30 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
24f40 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
24f50 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
24f60 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
24f70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24f80 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
24f90 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
24fa0 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
24fb0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
24fc0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
24fd0 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
24fe0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
24ff0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
25000 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
25010 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
25020 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
25030 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
25040 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
25050 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25060 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
25070 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
25080 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
25090 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
250a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
250b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
250c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
250d0 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
250e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
250f0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
25100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
25110 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
25120 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
25130 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
25140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25150 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
25160 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
25170 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
25180 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
25190 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
251a0 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
251b0 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
251c0 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
251d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
251e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
251f0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20  ents evaluated. 
25200 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
25210 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75  rned will.** usu
25220 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e  ally be pList->n
25230 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62  Expr but might b
25240 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c  e reduced if SQL
25250 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25260 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  .** is defined..
25270 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25280 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
25290 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
252a0 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
252b0 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
252c0 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
252d0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
252e0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
252f0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25300 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
25310 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
25320 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
25330 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
25340 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
25350 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
25360 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25370 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
25380 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
25390 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
253a0 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
253b0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
253c0 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
253d0 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
253e0 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
253f0 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
25400 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
25410 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
25420 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
25430 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45  ** If SQLITE_ECE
25440 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73  L_OMITREF is als
25450 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  o set, then the 
25460 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e  values with u.x.
25470 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a  iOrderByCol>0.**
25480 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74   are simply omit
25490 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
254a0 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f  being copied fro
254b0 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74  m srcReg..*/.int
254c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
254d0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
254e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
254f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25500 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
25510 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
25520 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25530 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
25540 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
25550 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
25560 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
25570 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
25580 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
25590 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
255a0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
255b0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
255c0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
255d0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
255e0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
255f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
25600 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
25610 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
25620 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25630 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
25640 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
25650 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25660 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
25670 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
25680 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
25690 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
256a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
256b0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
256c0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
256d0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
256e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
256f0 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
25700 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
25710 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
25720 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
25730 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
25740 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
25750 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
25760 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
25770 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20  ->pExpr;.#ifdef 
25780 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
25790 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
257a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62      if( pItem->b
257b0 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
257c0 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d     i--;.      n-
257d0 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  -;.    }else.#en
257e0 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61  dif.    if( (fla
257f0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25800 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
25810 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
25820 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
25830 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
25840 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
25850 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
25860 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
25870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25890 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
258a0 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
258b0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
258c0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
258d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
258e0 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a  ECEL_FACTOR)!=0.
258f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
25900 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25910 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
25920 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
25930 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
25940 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
25950 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
25960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25970 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
25980 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25990 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
259a0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
259b0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
259c0 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
259d0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
259e0 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
259f0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25a00 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
25a10 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
25a20 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
25a30 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
25a40 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
25a50 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
25a60 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
25a70 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
25a80 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
25a90 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
25aa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25ab0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25ad0 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
25ae0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25af0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25b00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
25b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25b20 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
25b30 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
25b40 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
25b50 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
25b60 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
25b70 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
25b80 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
25b90 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
25ba0 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
25bb0 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
25bc0 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
25bd0 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
25be0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
25bf0 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
25c00 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
25c10 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
25c20 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
25c40 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
25c50 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
25c60 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
25c70 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
25c80 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
25c90 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
25ca0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
25cb0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
25cc0 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
25cd0 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
25ce0 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
25cf0 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
25d00 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
25d10 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
25d20 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
25d30 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
25d40 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
25d50 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
25d60 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
25d70 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
25d80 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
25d90 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
25da0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
25db0 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
25dc0 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
25dd0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
25de0 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
25df0 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
25e00 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
25e10 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
25e20 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
25e30 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
25e40 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
25e50 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e  .){. Expr exprAn
25e60 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
25e70 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
25e80 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
25e90 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
25ea0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
25eb0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
25ec0 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
25ed0 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
25ee0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
25ef0 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
25f00 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
25f10 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
25f20 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
25f30 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
25f40 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  er */..  memset(
25f50 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
25f60 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
25f70 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
25f80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25f90 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
25fa0 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
25fb0 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
25fc0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25fd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
25fe0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
25ff0 78 70 72 4e 6f 64 65 43 6f 70 79 28 26 65 78 70  xprNodeCopy(&exp
26000 72 58 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rX, pExpr->pLeft
26010 29 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  );.  exprAnd.op 
26020 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
26030 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
26040 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
26050 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
26060 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
26070 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
26080 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
26090 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
260a0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
260b0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
260c0 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
260d0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
260e0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
260f0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
26100 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
26110 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
26120 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
26130 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
26140 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65  xprX, exprCodeVe
26150 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78  ctor(pParse, &ex
26160 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
26170 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b  ;.  if( xJump ){
26180 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73  .    xJump(pPars
26190 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
261a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
261b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
261c0 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
261d0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
261e0 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
261f0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
26200 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  in.    ** so tha
26210 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  t the sqlite3Exp
26220 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f  rCodeTarget() ro
26230 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61  utine will not a
26240 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20  ttempt to move. 
26250 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
26260 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
26270 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
26280 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
26290 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
262a0 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
262b0 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
262c0 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
262d0 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
262e0 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65  o we.    ** have
262f0 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
26300 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
26310 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65  Bummer. */.    e
26320 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
26330 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
26340 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
26350 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
26360 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
26370 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
26380 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26390 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
263a0 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
263b0 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
263c0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
263d0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
263e0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
263f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26400 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
26410 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26420 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26430 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
26440 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
26450 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26460 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26470 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26480 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26490 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
264a0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
264b0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
264c0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
264d0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
264e0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
264f0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26500 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
26510 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26520 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
26530 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26540 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26550 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
26560 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26570 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
26580 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26590 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
265a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
265b0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
265c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
265d0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
265e0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
265f0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26600 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
26610 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30  stcase( xJump==0
26620 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
26630 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26640 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
26650 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
26660 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
26670 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
26680 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
26690 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
266a0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
266b0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
266c0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
266d0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
266e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
266f0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
26700 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
26710 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
26720 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
26730 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
26740 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
26750 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
26760 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
26770 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
26780 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
26790 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
267a0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
267b0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
267c0 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
267d0 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
267e0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
267f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
26800 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
26810 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
26820 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
26830 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
26840 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
26850 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
26860 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
26870 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
26880 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
26890 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
268a0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
268b0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
268c0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
268d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
268e0 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
268f0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
26900 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
26910 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
26920 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26930 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
26940 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
26950 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
26960 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
26970 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
26980 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
26990 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
269a0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
269b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
269c0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
269d0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
269e0 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
269f0 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
26a00 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26a10 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
26a20 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
26a30 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
26a40 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
26a50 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
26a60 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
26a70 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
26a80 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
26a90 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
26aa0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
26ab0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26ac0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26ad0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26ae0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26af0 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
26b00 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
26b10 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
26b20 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26b30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
26b40 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
26b50 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
26b60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26b70 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
26b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26b90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
26ba0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26bb0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26bc0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26bd0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26be0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26bf0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26c00 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26c10 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26c20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
26c30 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
26c40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26c50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26c60 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
26c70 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26c80 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26c90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26ca0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26cb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26cc0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26ce0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
26cf0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
26d00 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a  t isNot;      /*
26d10 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
26d20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
26d30 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
26d40 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45  ;     /* IS TRUE
26d50 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
26d60 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
26d70 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26d80 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20   );.      isNot 
26d90 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
26da0 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73  _ISNOT;.      is
26db0 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
26dc0 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
26dd0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
26de0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54     testcase( isT
26df0 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26e10 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74  !isTrue && isNot
26e20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
26e30 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a  True ^ isNot ){.
26e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26e50 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26e60 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26e70 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
26ea0 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
26eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26ec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26ed0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26ee0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26ef0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26f10 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
26f20 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
26f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26f40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26f50 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26f60 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26f70 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26f80 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
26f90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26fa0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
26fb0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
26fc0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
26fd0 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
26fe0 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
26ff0 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
27000 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
27010 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
27020 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
27030 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
27040 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
27050 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
27060 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
27070 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
27080 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
27090 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
270a0 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
270b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
270c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
270d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
270e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
270f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27100 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
27110 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
27120 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
27140 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
27150 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
27160 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
27170 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
27180 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
271a0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
271b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
271c0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
271d0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
271e0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
271f0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27200 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
27210 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
27220 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27230 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
27240 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
27250 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
27260 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
27270 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27280 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
27290 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
272a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
272b0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
272c0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
272d0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
272e0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
272f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27300 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
27310 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
27320 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27330 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27340 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
27350 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
27360 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27370 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27380 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
27390 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
273a0 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
273b0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
273c0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
273d0 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
273e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
273f0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
27400 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
27410 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
27420 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27430 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27440 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
27450 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
27460 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27470 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
27480 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
27490 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
274a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
274b0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
274c0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
274d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
274e0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
274f0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
27500 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
27510 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
27520 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
27530 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
27540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
27550 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
27560 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
27570 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27580 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
27590 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
275a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
275b0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
275c0 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
275d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
275e0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
275f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27600 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
27610 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
27620 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27630 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
27640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27650 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
27660 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27670 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27680 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
27690 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
276a0 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
276b0 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75  e3ExprIfTrue, ju
276c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
276d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
276e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
276f0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
27700 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
27710 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
27720 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
27730 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
27740 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
27750 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
27760 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
27770 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
27780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27790 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
277a0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
277b0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
277c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
277d0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
277e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
277f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
27800 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
27810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
27820 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
27830 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
27840 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
27850 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
27860 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
27870 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
27880 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
27890 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
278a0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
278b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
278c0 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
278d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
278e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
278f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27900 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
27910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27920 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27930 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
27940 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
27950 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
27960 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
27970 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27980 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27990 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
279a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
279b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
279c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
279d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
279e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
279f0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
27a00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27a10 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
27a20 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
27a30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
27a40 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
27a50 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
27a60 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
27a70 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
27a80 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
27a90 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
27aa0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
27ab0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
27ac0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
27ad0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
27ae0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
27af0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
27b00 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
27b10 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
27b20 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
27b30 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
27b40 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
27b50 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
27b60 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
27b70 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
27b80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
27b90 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
27ba0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
27bb0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
27bc0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
27bd0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27be0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27bf0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
27c00 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
27c10 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
27c20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
27c30 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
27c40 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
27c50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
27c60 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
27c70 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
27c80 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
27c90 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27ca0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
27cb0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
27cc0 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
27cd0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
27ce0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
27cf0 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
27d00 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
27d10 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
27d20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
27d30 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
27d40 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
27d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
27d60 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
27d70 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
27d80 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
27d90 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
27da0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
27db0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
27dc0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
27dd0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27df0 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
27e00 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
27e10 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
27e20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
27e30 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
27e40 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
27e50 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
27e60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27e80 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
27e90 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
27ea0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
27eb0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
27ec0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
27ed0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
27ee0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
27ef0 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
27f00 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
27f10 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
27f20 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
27f30 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
27f40 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
27f50 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
27f60 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
27f70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
27f80 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
27f90 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
27fa0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
27fb0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
27fc0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
27fd0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
27fe0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27ff0 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
28000 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28010 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
28020 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
28030 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28040 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
28050 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
28060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28070 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
28080 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
28090 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
280a0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
280b0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
280c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
280d0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
280e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
280f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
28100 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
28110 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28120 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
28130 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
28140 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28150 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
28160 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
28170 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
28180 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
28190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
281a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
281b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
281c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
281d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
281e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
281f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28200 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
28210 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
28220 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28230 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
28240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28250 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
28260 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
28270 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
28280 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
28290 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
282a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
282b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
282c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
282d0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
282e0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
282f0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
28300 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28310 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28320 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28330 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28340 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28350 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
28360 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28370 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28380 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
28390 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
283a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
283b0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
283c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
283d0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
283e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
283f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28400 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
28410 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
28420 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54  t;   /* IS NOT T
28430 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
28440 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
28450 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20   isTrue;  /* IS 
28460 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
28470 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
28480 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28490 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
284a0 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
284b0 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
284c0 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
284d0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
284e0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
284f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28500 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
28510 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28520 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
28530 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
28540 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
28550 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28560 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f  S TRUE and IS NO
28570 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
28580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28590 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
285a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
285b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
285d0 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
285e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20  JUMPIFNULL);..  
285f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28600 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61     /* IS FALSE a
28610 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  nd IS NOT TRUE *
28620 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
28630 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28640 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28650 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
28680 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
28690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
286a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
286b0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
286c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
286d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
286e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
286f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28700 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
28710 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
28720 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
28730 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
28740 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
28750 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
28760 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
28770 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
28780 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
28790 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
287a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
287b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
287c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
287d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
287e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
287f0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
28800 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
28810 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
28820 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
28830 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28840 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
28850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28860 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28870 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
28880 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
28890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
288a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
288b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
288c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
288d0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
288e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
288f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28900 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
28910 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
28920 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28940 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
28950 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
28960 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28970 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
28980 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
28990 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
289a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
289b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289c0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
289d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
289e0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
289f0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
28a00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
28a10 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
28a20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
28a30 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
28a40 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
28a50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28a60 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
28a70 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
28a80 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
28a90 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
28aa0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28ab0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28ac0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
28ad0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28ae0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28af0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
28b00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
28b10 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28b20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
28b30 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
28b40 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
28b50 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28b60 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
28b70 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
28b80 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28b90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28ba0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28bb0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
28bc0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28be0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
28bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28c00 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
28c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28c20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
28c30 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
28c40 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
28c50 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28c60 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28c70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28c80 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28ca0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28cb0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
28cc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
28cd0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
28ce0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
28cf0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
28d00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28d10 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
28d20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28d30 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
28d40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28d50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28d60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28d70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
28d80 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28d90 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28da0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28db0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28dc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28dd0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28de0 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
28df0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
28e00 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
28e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28e20 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
28e30 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
28e40 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
28e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28e60 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28e70 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28e80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28e90 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28ea0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
28eb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28ec0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
28ed0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28ee0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
28ef0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
28f00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28f10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28f20 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
28f30 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
28f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28f50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
28f60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
28f70 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20  ult_expr: .     
28f80 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
28f90 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
28fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28fb0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
28fc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28fd0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
28fe0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28ff0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
29000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29010 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
29020 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
29030 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
29040 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
29050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29060 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
29070 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
29080 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
29090 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
290a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
290b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
290c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
290d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
290e0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
290f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
29100 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
29110 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
29120 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
29130 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29140 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
29150 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
29160 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
29170 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63  xprIfFalse() exc
29180 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20  ept that a copy 
29190 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72  is made of pExpr
291a0 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20   before.** code 
291b0 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20  generation, and 
291c0 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c  that copy is del
291d0 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20  eted after code 
291e0 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73  generation. This
291f0 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74  .** ensures that
29200 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45   the original pE
29210 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64  xpr is unchanged
29220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29230 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
29240 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29250 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
29260 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e  dest,int jumpIfN
29270 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ull){.  sqlite3 
29280 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29290 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20  ;.  Expr *pCopy 
292a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
292b0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
292c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
292d0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
292e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
292f0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70  lse(pParse, pCop
29300 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  y, dest, jumpIfN
29310 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
29320 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
29330 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a  , pCopy);.}../*.
29340 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56  ** Expression pV
29350 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ar is guaranteed
29360 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61   to be an SQL va
29370 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61  riable. pExpr ma
29380 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65  y be any.** type
29390 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   of expression..
293a0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
293b0 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76  s a simple SQL v
293c0 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65  alue - an intege
293d0 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c  r, real, string,
293e0 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c   blob.** or NULL
293f0 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68   value - then th
29400 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79  e VDBE currently
29410 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20   being prepared 
29420 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
29430 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65   to re-prepare e
29440 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76  ach time a new v
29450 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f  alue is bound to
29460 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a   variable pVar..
29470 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  **.** Additional
29480 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  ly, if pExpr is 
29490 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
294a0 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ue and the value
294b0 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
294c0 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  as that currentl
294d0 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  y bound to varia
294e0 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65  ble pVar, non-ze
294f0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
29500 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
29510 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
29520 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20  not the same or 
29530 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  if pExpr is not 
29540 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20  a simple.** SQL 
29550 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72  value, zero is r
29560 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29570 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61  ic int exprCompa
29580 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65  reVariable(Parse
29590 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
295a0 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70  pVar, Expr *pExp
295b0 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  r){.  int res = 
295c0 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20  0;.  int iVar;. 
295d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
295e0 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a  pL, *pR = 0;.  .
295f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29600 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  omExpr(pParse->d
29610 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45  b, pExpr, SQLITE
29620 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46  _UTF8, SQLITE_AF
29630 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20  F_BLOB, &pR);.  
29640 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56  if( pR ){.    iV
29650 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75  ar = pVar->iColu
29660 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
29670 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
29680 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
29690 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c  r);.    pL = sql
296a0 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
296b0 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
296c0 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
296d0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29  SQLITE_AFF_BLOB)
296e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a  ;.    if( pL ){.
296f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29700 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29  3_value_type(pL)
29710 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
29720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29730 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b  _value_text(pL);
29740 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
29750 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54  e encoding is UT
29760 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  F-8 */.      }. 
29770 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73       res =  0==s
29780 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
29790 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20  (pL, pR, 0);.   
297a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
297b0 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20  lueFree(pR);.   
297c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
297d0 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  e(pL);.  }..  re
297e0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
297f0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
29800 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
29810 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
29820 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
29830 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29840 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
29850 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
29860 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
29870 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
29880 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
29890 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
298a0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
298b0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
298c0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
298d0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
298e0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
298f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
29900 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29910 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29920 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29930 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
29940 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
29950 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
29960 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
29970 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
29980 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
29990 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
299a0 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
299b0 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
299c0 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
299d0 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
299e0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
299f0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
29a00 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
29a10 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
29a20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
29a30 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
29a40 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
29a50 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
29a60 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
29a70 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
29a80 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
29a90 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
29aa0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29ab0 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
29ac0 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
29ad0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
29ae0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
29af0 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
29b00 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
29b10 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
29b20 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
29b30 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
29b40 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
29b50 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
29b60 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
29b70 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
29b80 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
29b90 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
29ba0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
29bb0 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
29bc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
29bd0 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
29be0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
29bf0 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
29c00 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
29c10 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
29c20 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
29c30 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
29c40 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
29c50 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
29c60 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
29c70 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  n..**.** If pPar
29c80 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  se is not NULL t
29c90 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  hen TK_VARIABLE 
29ca0 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68  terms in pA with
29cb0 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20   bindings in.** 
29cc0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
29cd0 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  re can be matche
29ce0 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61  d against litera
29cf0 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a  ls in pB.  The .
29d00 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ** pParse->pVdbe
29d10 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73  ->expmask bitmas
29d20 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72  k is updated for
29d30 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72   each variable r
29d40 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66  eferenced..** If
29d50 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20   pParse is NULL 
29d60 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65  (the normal case
29d70 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41  ) then any TK_VA
29d80 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a  RIABLE term in .
29d90 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72  ** Argument pPar
29da0 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  se should normal
29db0 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ly be NULL. If i
29dc0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  t is not NULL an
29dd0 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61  d pA or.** pB ca
29de0 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61  uses a return va
29df0 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74  lue of 2..*/.int
29e00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29e10 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  are(Parse *pPars
29e20 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70  e, Expr *pA, Exp
29e30 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
29e40 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
29e50 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
29e60 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
29e70 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
29e80 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
29e90 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41  if( pParse && pA
29ea0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
29eb0 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65  E && exprCompare
29ec0 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c  Variable(pParse,
29ed0 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20   pA, pB) ){.    
29ee0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29ef0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
29f00 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
29f10 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
29f20 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29f30 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
29f40 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
29f50 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
29f60 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
29f70 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
29f80 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
29f90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
29fa0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29fb0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
29fc0 70 42 2d 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70  pB->op || pA->op
29fd0 3d 3d 54 4b 5f 52 41 49 53 45 20 29 7b 0a 20 20  ==TK_RAISE ){.  
29fe0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
29ff0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2a000 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a010 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a020 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
2a030 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
2a050 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2a060 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
2a070 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2a080 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
2a090 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
2a0a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2a0b0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2a0c0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
2a0d0 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
2a0e0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
2a0f0 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2a100 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2a110 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2a120 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a130 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a140 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a150 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a160 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   2;.#ifndef SQLI
2a170 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2a180 4e 43 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  NC.      /* Just
2a190 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68  ification for th
2a1a0 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20  e assert():.    
2a1b0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
2a1c0 74 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70  tions have p->op
2a1d0 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75  ==TK_FUNCTION bu
2a1e0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2a1f0 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 68  tions.      ** h
2a200 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  ave p->op==TK_AG
2a210 47 5f 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20  G_FUNCTION.  So 
2a220 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  any comparison b
2a230 65 74 77 65 65 6e 20 61 6e 20 61 67 67 72 65 67  etween an aggreg
2a240 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  ate.      ** fun
2a250 63 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64  ction and a wind
2a260 6f 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ow function shou
2a270 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 62  ld have failed b
2a280 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a 20  efore reaching. 
2a290 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2a2a0 6e 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73 20  nt.  And, it is 
2a2b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2a2c0 68 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66 75  have a window fu
2a2d0 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  nction and.     
2a2e0 20 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e   ** a scalar fun
2a2f0 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2a300 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d  ame name and num
2a310 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2a320 2e 20 20 53 6f 0a 20 20 20 20 20 20 2a 2a 20 69  .  So.      ** i
2a330 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2a340 70 6f 69 6e 74 2c 20 65 69 74 68 65 72 20 41 20  point, either A 
2a350 61 6e 64 20 42 20 62 6f 74 68 20 77 69 6e 64 6f  and B both windo
2a360 77 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20  w functions or. 
2a370 20 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72 20       ** neither 
2a380 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  are a window fun
2a390 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20  ctions. */.     
2a3a0 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
2a3b0 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2a3c0 69 6e 46 75 6e 63 29 3d 3d 45 78 70 72 48 61 73  inFunc)==ExprHas
2a3d0 50 72 6f 70 65 72 74 79 28 70 42 2c 45 50 5f 57  Property(pB,EP_W
2a3e0 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20  inFunc) );.     
2a3f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2a400 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
2a410 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nc) ){.        i
2a420 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  f( sqlite3Window
2a430 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70  Compare(pParse,p
2a440 41 2d 3e 79 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e  A->y.pWin,pB->y.
2a450 70 57 69 6e 29 21 3d 30 20 29 20 72 65 74 75 72  pWin)!=0 ) retur
2a460 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  n 2;.      }.#en
2a470 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
2a480 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  ( pA->op==TK_NUL
2a490 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L ){.      retur
2a4a0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
2a4b0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a4c0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2a4d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2a4e0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a4f0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a500 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a510 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
2a520 53 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  S(pB->u.zToken!=
2a530 30 29 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d  0) && strcmp(pA-
2a540 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a550 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
2a560 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
2a570 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2a580 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
2a590 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
2a5a0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a5b0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
2a5c0 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
2a5d0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2a5e0 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ly)==0 ){.    if
2a5f0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a600 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
2a610 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a620 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2a630 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
2a640 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
2a650 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a660 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a670 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a680 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a690 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a6a0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a6b0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a6c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a6d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a6e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a6f0 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a700 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a710 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a720 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70  urn 2;.    if( p
2a730 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a740 0a 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21  .     && pA->op!
2a750 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20  =TK_TRUEFALSE.  
2a760 20 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46     && (combinedF
2a770 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a780 64 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  d)==0.    ){.   
2a790 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a7a0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a7b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a7c0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2a7d0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2a7e0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2a7f0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2a800 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2a810 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2a820 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a830 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2a840 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2a850 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2a860 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2a870 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2a880 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2a890 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2a8a0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2a8b0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2a8c0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2a8d0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2a8e0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2a8f0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2a900 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2a910 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2a920 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2a930 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2a940 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2a950 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2a960 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2a970 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2a980 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2a990 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2a9a0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2a9b0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2a9c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2a9d0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2a9e0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2a9f0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2aa00 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2aa10 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2aa20 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2aa30 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2aa40 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2aa50 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2aa60 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2aa70 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2aa80 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2aa90 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2aaa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2aab0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2aac0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2aad0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2aae0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2aaf0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2ab00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2ab10 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2ab20 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2ab30 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2ab40 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2ab50 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2ab60 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2ab70 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2ab80 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2ab90 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2aba0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2abb0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2abc0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2abd0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2abe0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2abf0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2ac00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ac10 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2ac20 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2ac30 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2ac40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ac50 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2ac60 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2ac70 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2ac80 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2ac90 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2aca0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2acb0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2acc0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2acd0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2ace0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2acf0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ad10 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ad20 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2ad30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ad40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2ad50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2ad60 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2ad70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2ad80 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2ad90 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2ada0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2adb0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2adc0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2add0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2ade0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2adf0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2ae00 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2ae10 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2ae20 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2ae30 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2ae40 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2ae50 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2ae60 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2ae70 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2ae80 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2ae90 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2aea0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2aeb0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2aec0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2aed0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2aee0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2aef0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2af00 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2af10 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2af20 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2af30 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2af40 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2af50 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2af60 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2af70 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2af80 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2af90 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2afa0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2afb0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2afc0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2afd0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2afe0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2aff0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2b000 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2b010 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2b020 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2b030 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2b040 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2b050 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2b060 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2b070 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2b080 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2b090 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2b0a0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2b0b0 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2b0c0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2b0d0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2b0e0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2b0f0 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2b100 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2b110 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2b120 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2b130 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2b140 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2b150 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2b160 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2b170 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2b180 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2b190 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2b1a0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2b1b0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2b1c0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2b1d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2b1e0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2b1f0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2b200 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2b210 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2b220 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2b230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b240 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2b250 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b260 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2b270 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2b280 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2b290 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2b2a0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2b2b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b2c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2b2d0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2b2e0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2b2f0 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2b300 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2b310 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2b320 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2b330 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b340 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b350 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2b360 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b370 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b380 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2b390 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2b3a0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2b3b0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2b3c0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2b3d0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b3e0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2b3f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b400 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2b410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b420 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b430 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2b440 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2b450 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b460 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b470 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2b480 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2b490 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2b4a0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b4b0 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2b4c0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2b4d0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2b4e0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2b4f0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2b500 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2b510 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2b520 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2b530 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2b540 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2b550 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2b560 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2b570 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2b580 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2b590 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2b5a0 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2b5b0 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2b5c0 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2b5d0 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2b5e0 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2b5f0 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2b600 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2b610 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2b620 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2b630 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2b640 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2b650 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2b660 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b670 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2b680 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2b690 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2b6a0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2b6b0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b6c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2b6d0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2b6e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2b6f0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b700 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b710 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2b720 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2b730 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2b740 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2b750 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2b760 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2b770 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2b780 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2b790 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2b7a0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b7b0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2b7c0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b7d0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2b7e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b7f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2b800 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2b810 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b820 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
2b830 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b840 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
2b850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b860 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41  pExpr->op==TK_CA
2b870 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SE );.      test
2b880 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b890 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
2b8a0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b8b0 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2b8c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2b8d0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2b8e0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
2b8f0 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
2b900 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72  r->u.iCur==pExpr
2b910 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
2b920 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b930 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2b940 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b960 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b970 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;..    /* Virtua
2b980 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c  l tables are all
2b990 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73  owed to use cons
2b9a0 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e  traints like x=N
2b9b0 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  ULL.  So.    ** 
2b9c0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
2b9d0 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20  rm x=y does not 
2b9e0 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20  prove that y is 
2b9f0 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20  not null if x.  
2ba00 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75    ** is the colu
2ba10 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  mn of a virtual 
2ba20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  table */.    cas
2ba30 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
2ba40 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
2ba50 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
2ba60 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
2ba70 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
2ba80 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74  e TK_GE:.      t
2ba90 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2baa0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
2bab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bac0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  pr->op==TK_NE );
2bad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bae0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
2baf0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2bb00 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bb10 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
2bb20 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bb30 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
2bb40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bb50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  pr->op==TK_GE );
2bb60 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70  .      if( (pExp
2bb70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
2bb80 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72  _COLUMN && IsVir
2bb90 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66  tual(pExpr->pLef
2bba0 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20  t->y.pTab)).    
2bbb0 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52     || (pExpr->pR
2bbc0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
2bbd0 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c  UMN && IsVirtual
2bbe0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2bbf0 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29  y.pTab)).      )
2bc00 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  {.       return 
2bc10 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2bc20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
2bc30 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2bc40 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
2bc50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2bc60 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
2bc70 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  f expression p c
2bc80 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20  an only be true 
2bc90 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  if at least.** o
2bca0 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
2bcb0 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e  le iTab is non-n
2bcc0 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ull.  In other w
2bcd0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75  ords, return tru
2bce0 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69  e.** if expressi
2bcf0 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73  on p will always
2bd00 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73   be NULL or fals
2bd10 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  e if every colum
2bd20 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20  n of iTab.** is 
2bd30 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  NULL..**.** Fals
2bd40 65 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20  e negatives are 
2bd50 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20  acceptable.  In 
2bd60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
2bd70 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a  is ok to return.
2bd80 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  ** zero even if 
2bd90 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c  expression p wil
2bda0 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20  l never be true 
2bdb0 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  of every column 
2bdc0 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2bdd0 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  LL.  A false neg
2bde0 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20  ative is merely 
2bdf0 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a  a missed optimiz
2be00 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ation opportunit
2be10 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70  y..**.** False p
2be20 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74  ositives are not
2be30 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65   allowed, howeve
2be40 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  r.  A false posi
2be50 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a  tive may result.
2be60 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  ** in an incorre
2be70 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a  ct answer..**.**
2be80 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74   Terms of p that
2be90 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68   are marked with
2bea0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e   EP_FromJoin (an
2beb0 64 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d  d hence that com
2bec0 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e  e from.** the ON
2bed0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2bee0 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29  s of LEFT JOINS)
2bef0 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72   are excluded fr
2bf00 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  om the analysis.
2bf10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bf20 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
2bf30 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a  heck if a LEFT J
2bf40 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  OIN can be conve
2bf50 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  rted into.** an 
2bf60 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20  ordinary JOIN.  
2bf70 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69  The p argument i
2bf80 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2bf90 73 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52  se.  If the WHER
2bfa0 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75  E.** clause requ
2bfb0 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63  ires that some c
2bfc0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67  olumn of the rig
2bfd0 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
2bfe0 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20  LEFT JOIN.** be 
2bff0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  non-NULL, then t
2c000 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e  he LEFT JOIN can
2c010 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65   be safely conve
2c020 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  rted into an.** 
2c030 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a  ordinary join..*
2c040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2c050 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2c060 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ow(Expr *p, int 
2c070 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iTab){.  Walker 
2c080 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2c090 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f  back = impliesNo
2c0a0 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53  tNullRow;.  w.xS
2c0b0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2c0c0 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  0;.  w.xSelectCa
2c0d0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
2c0e0 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
2c0f0 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  u.iCur = iTab;. 
2c100 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2c110 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
2c120 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
2c130 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2c140 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2c150 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2c160 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2c170 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2c180 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2c190 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2c1a0 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2c1b0 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2c1c0 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2c1d0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2c1e0 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2c1f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2c200 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2c210 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2c220 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2c230 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2c240 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2c250 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2c260 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2c270 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2c280 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2c290 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2c2a0 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2c2b0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2c2c0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2c2d0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2c2e0 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2c2f0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2c300 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2c310 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2c320 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2c330 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2c340 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2c350 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2c360 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2c370 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2c380 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2c390 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2c3a0 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2c3b0 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2c3c0 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2c3d0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2c3e0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2c3f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2c400 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2c410 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2c420 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2c430 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2c440 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2c450 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2c460 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2c470 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2c480 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2c490 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2c4a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2c4b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2c4c0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2c4d0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2c4e0 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2c4f0 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2c500 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2c510 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2c520 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2c530 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2c540 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2c550 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2c560 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2c570 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2c580 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2c590 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2c5a0 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2c5b0 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2c5c0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2c5d0 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2c5e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2c5f0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2c600 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2c610 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2c620 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2c630 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2c640 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2c650 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2c660 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2c670 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2c680 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2c690 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2c6a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2c6b0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2c6c0 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2c6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2c6e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2c6f0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2c700 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2c710 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2c720 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2c730 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2c740 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2c750 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2c760 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2c770 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2c780 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2c790 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2c7a0 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2c7b0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2c7c0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2c7d0 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2c7e0 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2c7f0 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2c800 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2c810 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2c820 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2c830 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2c840 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c850 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2c860 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2c870 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2c880 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2c890 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2c8a0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2c8b0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2c8c0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2c8d0 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2c8e0 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2c8f0 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2c900 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2c910 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2c920 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2c930 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2c940 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2c950 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2c960 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2c970 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2c980 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2c990 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2c9a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2c9b0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2c9c0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2c9d0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2c9e0 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2c9f0 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2ca00 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2ca10 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2ca20 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2ca30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2ca40 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2ca50 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2ca60 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2ca70 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2ca80 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2ca90 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2caa0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2cab0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2cac0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2cad0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2cae0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2caf0 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2cb00 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2cb10 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2cb20 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2cb30 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2cb40 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2cb50 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2cb60 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2cb70 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2cb80 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2cb90 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2cba0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2cbb0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2cbc0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2cbd0 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2cbe0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2cbf0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2cc00 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2cc10 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2cc20 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2cc30 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2cc40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2cc50 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2cc60 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2cc70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2cc80 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2cc90 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2cca0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2ccb0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2ccc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2ccd0 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2cce0 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2ccf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2cd00 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2cd10 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cd20 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cd30 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2cd40 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2cd50 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2cd60 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2cd70 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2cd80 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2cd90 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2cda0 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2cdb0 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2cdc0 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2cdd0 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2cde0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2cdf0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2ce00 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2ce10 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2ce20 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2ce30 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2ce40 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2ce50 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2ce60 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2ce70 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2ce80 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2ce90 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2cea0 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2ceb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2cec0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2ced0 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2cee0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2cef0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2cf00 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2cf10 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2cf20 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2cf30 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2cf40 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2cf50 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2cf60 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2cf70 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2cf80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2cf90 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2cfa0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2cfb0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2cfc0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2cfd0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2cfe0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2cff0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2d000 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2d010 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2d020 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2d030 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2d040 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2d050 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2d060 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2d070 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2d080 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2d090 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2d0a0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2d0b0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2d0c0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2d0d0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2d0e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2d0f0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2d100 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2d110 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2d120 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2d130 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2d140 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2d150 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2d160 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2d170 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2d180 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2d190 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2d1a0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2d1b0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2d1c0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2d1d0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2d1e0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2d1f0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2d200 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2d210 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2d220 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2d230 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2d240 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2d250 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2d260 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2d270 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2d280 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2d290 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2d2a0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2d2b0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2d2c0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2d2d0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2d2e0 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2d2f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2d300 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2d310 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d320 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2d330 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2d340 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2d350 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2d360 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2d370 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2d380 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2d390 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2d3a0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2d3b0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2d3c0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2d3d0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2d3e0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2d3f0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2d400 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2d410 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2d420 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2d430 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2d440 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2d450 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2d460 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2d470 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2d480 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2d490 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d4a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2d4b0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2d4c0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2d4d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d4e0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2d4f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2d500 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2d510 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2d520 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2d530 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2d540 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2d550 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2d560 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2d570 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2d580 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d590 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2d5a0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2d5b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2d5c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2d5d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2d5e0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2d5f0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2d600 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d610 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d620 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2d630 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2d640 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2d650 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2d660 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2d670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d680 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2d690 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2d6a0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2d6b0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2d6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d6d0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2d6e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2d6f0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2d700 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2d710 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2d720 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2d730 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2d740 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2d750 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2d760 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2d770 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2d780 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2d790 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d7a0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2d7b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2d7c0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2d7e0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2d7f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2d800 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2d810 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2d820 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2d830 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2d840 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2d850 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2d860 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2d870 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d880 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2d890 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2d8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d8b0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2d8c0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2d8d0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2d8e0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2d8f0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2d900 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2d910 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d920 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2d930 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2d940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d950 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2d960 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2d970 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d980 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2d990 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2d9a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2d9b0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2d9c0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2d9d0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2d9e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2da00 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2da10 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2da20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2da30 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2da40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2da50 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2da60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2da70 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2da90 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2daa0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2dab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dac0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2dad0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2dae0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2daf0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2db00 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2db10 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2db20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2db30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2db40 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2db50 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db70 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2db80 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2db90 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2dba0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2dbc0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2dbd0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbf0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2dc00 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2dc20 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2dc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc60 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2dc70 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2dc80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2dc90 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2dca0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2dcb0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2dcc0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2dcd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2dcf0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2dd00 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2dd10 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2dd20 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2dd40 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2dd50 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2dd60 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2dd70 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2dd80 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2dd90 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2dda0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2ddb0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2ddc0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2ddd0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2dde0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2ddf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2de00 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2de10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2de20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2de30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2de40 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2de50 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2de60 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2de70 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2de80 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2de90 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2dea0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2deb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2dec0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2ded0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2dee0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2def0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2df00 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2df10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2df20 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2df30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2df40 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2df50 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2df60 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2df70 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2df80 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2df90 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2dfa0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2dfb0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2dfc0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2dfd0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2dfe0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2dff0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2e000 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2e010 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2e020 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2e030 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2e040 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2e050 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2e060 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2e070 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2e080 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2e090 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2e0a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2e0b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2e0c0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2e0d0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2e0e0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2e0f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e110 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e120 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2e130 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2e140 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2e150 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2e160 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2e170 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2e180 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e190 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2e1a0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2e1b0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2e1c0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2e1d0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2e1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e1f0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2e200 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e210 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2e220 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2e230 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2e240 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2e250 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2e260 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e270 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2e280 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2e290 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2e2a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e2b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e2c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e2d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2e2e0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2e2f0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2e300 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2e310 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2e320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e330 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2e340 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2e350 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2e360 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2e370 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2e380 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2e390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2e3a0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2e3b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2e3c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e3d0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2e3e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2e3f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2e410 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2e420 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2e430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2e440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e450 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2e460 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2e470 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2e480 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2e490 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e4a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e4b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2e4c0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2e4d0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2e4e0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2e4f0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2e500 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2e510 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2e520 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2e530 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2e540 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2e550 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e560 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2e570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e580 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2e590 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2e5a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e5b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2e5c0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2e5d0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2e5e0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2e5f0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2e600 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2e610 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2e620 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2e630 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2e640 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2e650 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2e660 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2e670 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2e680 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2e690 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2e6a0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2e6b0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2e6c0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2e6d0 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2e6e0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2e6f0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2e700 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2e710 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2e720 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2e730 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2e740 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2e750 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2e760 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2e770 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2e780 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2e790 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2e7a0 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2e7b0 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2e7c0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2e7d0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2e7e0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2e7f0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2e800 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2e810 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2e820 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2e830 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2e840 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e850 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2e860 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2e870 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2e880 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2e890 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2e8a0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2e8b0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2e8c0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2e8d0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2e8e0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2e8f0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2e900 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2e910 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2e920 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2e930 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73  = pNC;.  w.pPars
2e940 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2e950 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2e960 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2e970 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2e980 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2e990 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e9a0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2e9b0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2e9c0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2e9d0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2e9e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e9f0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2ea00 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2ea10 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2ea20 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2ea30 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2ea40 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2ea50 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2ea60 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2ea70 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2ea80 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2ea90 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2eaa0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2eab0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2eac0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2ead0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2eae0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2eaf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2eb00 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2eb10 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2eb20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2eb30 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2eb40 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2eb50 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2eb60 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2eb70 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2eb80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2eb90 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2eba0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2ebb0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2ebc0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2ebd0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2ebe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2ebf0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2ec00 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2ec10 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2ec20 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2ec30 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2ec40 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2ec50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2ec60 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2ec70 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2ec80 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2ec90 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2eca0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2ecb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2ecc0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2ecd0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2ece0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2ecf0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2ed00 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2ed10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2ed20 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2ed30 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2ed40 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2ed50 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2ed60 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2ed70 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2ed80 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2ed90 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2eda0 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2edb0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2edc0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2edd0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2ede0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2edf0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2ee00 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2ee10 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2ee20 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2ee30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2ee40 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2ee50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2ee60 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2ee70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2ee80 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2ee90 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2eea0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2eeb0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2eec0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2eed0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2eee0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2eef0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2ef00 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2ef10 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2ef20 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2ef30 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2ef40 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2ef50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2ef60 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2ef70 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2ef80 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2ef90 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2efa0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2efb0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2efc0 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2efd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2efe0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2eff0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2f000 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2f010 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2f020 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2f030 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2f040 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2f050 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2f060 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2f070 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2f080 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2f090 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2f0a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2f0b0 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2f0c0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2f0d0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2f0e0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2f0f0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2f100 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2f110 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2f120 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2f130 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2f140 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2f150 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2f160 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2f170 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2f180 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2f190 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2f1a0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2f1b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2f1c0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2f1d0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2f1e0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2f1f0 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2f200 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2f210 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2f220 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f230 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2f240 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2f250 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2f260 55 47 20 2a 2f 0a                                UG */.