/ Hex Artifact Content
Login

Artifact 7f39a0138ca8e07daaa25fccff97f43c2b29df1153b6e462d43fb23833be2eaf:


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 70  back2 = 0;.  w.p
b450: 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 77 2e 75  Parse = 0;.  w.u
b460: 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  .pSelect = p;.  
b470: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
b480: 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64  t(&w, p);.}.#end
b490: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
b4a0: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
b4b0: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
b4c0: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
b4d0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
b4e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
b4f0: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
b500: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
b510: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
b520: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
b530: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
b540: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
b550: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
b560: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
b570: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
b580: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
b590: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
b5a0: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
b5b0: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
b5c0: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
b5d0: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
b5e0: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
b5f0: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
b600: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
b610: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
b620: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
b630: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
b640: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
b650: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
b660: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
b670: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
b680: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
b690: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
b6a0: 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  icated..**.** Th
b6b0: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b6c0: 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d  r contains a com
b6d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
b6e0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
b6f0: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  s..** If the EXP
b700: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
b710: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
b720: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
b730: 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75  rned is a.** tru
b740: 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  ncated version o
b750: 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72  f the usual Expr
b760: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b770: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  will be stored a
b780: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  s.** part of the
b790: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
b7a0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b7b0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
b7c0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
b7d0: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
b7e0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
b7f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
b800: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
b810: 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  | flags==EXPRDUP
b820: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74  _REDUCE );.  ret
b830: 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28  urn p ? exprDup(
b840: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
b850: 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74   : 0;.}.ExprList
b860: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
b870: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b880: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
b890: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
b8a0: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
b8b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b8c0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
b8d0: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
b8e0: 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65    Expr *pPriorSe
b8f0: 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61  lectCol = 0;.  a
b900: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b910: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b920: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
b930: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b940: 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33  awNN(db, sqlite3
b950: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
b960: 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77   p));.  if( pNew
b970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b980: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
b990: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65  p->nExpr;.  pIte
b9a0: 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70  m = pNew->a;.  p
b9b0: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
b9c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b9d0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
b9e0: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
b9f0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
ba00: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
ba10: 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  >pExpr;.    Expr
ba20: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
ba30: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
ba40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ba50: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
ba60: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  s);.    if( pOld
ba70: 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f  Expr .     && pO
ba80: 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  ldExpr->op==TK_S
ba90: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20  ELECT_COLUMN.   
baa0: 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d    && (pNewExpr =
bab0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d   pItem->pExpr)!=
bac0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
bad0: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
bae0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
baf0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  i>0 );.      if(
bb00: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
bb10: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
bb20: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70   assert( pOldExp
bb30: 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78  r->pLeft==pOldEx
bb40: 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20  pr->pRight );.  
bb50: 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65        pPriorSele
bb60: 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72  ctCol = pNewExpr
bb70: 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78  ->pLeft = pNewEx
bb80: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
bb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bba0: 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
bbb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bbc0: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21  pItem[-1].pExpr!
bbd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
bbe0: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e  sert( pNewExpr->
bbf0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d  iColumn==pItem[-
bc00: 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  1].pExpr->iColum
bc10: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  n+1 );.        a
bc20: 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c  ssert( pPriorSel
bc30: 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31  ectCol==pItem[-1
bc40: 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ].pExpr->pLeft )
bc50: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78  ;.        pNewEx
bc60: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69  pr->pLeft = pPri
bc70: 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20  orSelectCol;.   
bc80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bc90: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
bca0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
bcb0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
bcc0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
bcd0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
bce0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bcf0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
bd00: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
bd10: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
bd20: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
bd30: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
bd40: 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73    pItem->bSpanIs
bd50: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
bd60: 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20  bSpanIsTab;.    
bd70: 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
bd80: 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  f = pOldItem->bS
bd90: 6f 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49  orterRef;.    pI
bda0: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
bdb0: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
bdc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
bdd0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
bde0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
bdf0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
be00: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
be10: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
be20: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
be30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
be40: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
be50: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
be60: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
be70: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
be80: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
be90: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
bea0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
beb0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
bec0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bed0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
bee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bef0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
bf00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
bf20: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
bf30: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
bf40: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
bf50: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
bf60: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
bf70: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
bf80: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
bf90: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bfa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bfb0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
bfc0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
bfd0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
bfe0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
bff0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
c000: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c010: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
c020: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
c030: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c040: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
c050: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
c060: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
c070: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
c080: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
c090: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
c0a0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
c0b0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
c0c0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
c0d0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
c0e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
c0f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
c100: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
c110: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c120: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
c130: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
c140: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c150: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
c160: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
c170: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
c180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c190: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
c1a0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
c1b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c1c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c1d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
c1e0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
c1f0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
c200: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
c210: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
c220: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
c230: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
c240: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
c250: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
c260: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
c270: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
c280: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
c290: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
c2a0: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
c2b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
c2c0: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
c2d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c2e0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
c2f0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
c300: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
c310: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
c320: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
c330: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
c340: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
c350: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c360: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
c370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c380: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
c390: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
c3a0: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
c3b0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
c3c0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
c3d0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
c3e0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
c3f0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
c400: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
c410: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
c420: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
c430: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
c440: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
c450: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
c460: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
c470: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
c480: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
c490: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c4a0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
c4b0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
c4c0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
c4d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
c4e0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
c4f0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
c500: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c510: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
c520: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
c530: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
c540: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
c550: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
c560: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c570: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c580: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
c590: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c5a0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c5b0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
c5c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
c5d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
c5e0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
c5f0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c600: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
c610: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
c620: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
c630: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
c640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
c650: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
c660: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
c670: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
c680: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
c690: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
c6a0: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
c6b0: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
c6c0: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
c6d0: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
c6e0: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
c6f0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
c700: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
c710: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
c720: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
c730: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
c740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c750: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c760: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
c770: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
c780: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c790: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
c7a0: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
c7b0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
c7c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c7d0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
c7e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
c7f0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
c800: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
c810: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
c820: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c830: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c840: 65 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74  elect *pDup, int
c850: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
c860: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53  t *pRet = 0;.  S
c870: 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30  elect *pNext = 0
c880: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20  ;.  Select **pp 
c890: 3d 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63  = &pRet;.  Selec
c8a0: 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  t *p;..  assert(
c8b0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28   db!=0 );.  for(
c8c0: 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  p=pDup; p; p=p->
c8d0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
c8e0: 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ect *pNew = sqli
c8f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c900: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
c910: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c920: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c930: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
c940: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c950: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
c960: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c970: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
c980: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
c990: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
c9a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  .    pNew->pWher
c9b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
c9c0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
c9d0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c9e0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
c9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ca00: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
ca10: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
ca20: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
ca30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ca40: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
ca50: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
ca60: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
ca70: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ca80: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
ca90: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
caa0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20  >op = p->op;.   
cab0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
cac0: 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Next;.    pNew->
cad0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cae0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
caf0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
cb00: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
cb10: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
cb20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
cb30: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
cb40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
cb50: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
cb60: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
cb70: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
cb80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
cb90: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cba0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
cbb0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cbc0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
cbd0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
cbe0: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
cbf0: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
cc00: 57 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53  With);.#ifndef S
cc10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cc20: 57 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e  WFUNC.    pNew->
cc30: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e  pWin = 0;.    pN
cc40: 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73  ew->pWinDefn = s
cc50: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
cc60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44  Dup(db, p->pWinD
cc70: 65 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  efn);.    if( p-
cc80: 3e 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65  >pWin ) gatherSe
cc90: 6c 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77  lectWindows(pNew
cca0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e  );.#endif.    pN
ccb0: 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73  ew->selId = p->s
ccc0: 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20  elId;.    *pp = 
ccd0: 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26  pNew;.    pp = &
cce0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pNew->pPrior;.  
ccf0: 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a    pNext = pNew;.
cd00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
cd10: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  et;.}.#else.Sele
cd20: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
cd30: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
cd40: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
cd50: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
cd60: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
cd70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
cd80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
cd90: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
cda0: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
cdb0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
cdc0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
cdd0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
cde0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
cdf0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
ce00: 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61  *.** The pList a
ce10: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
ce20: 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
ce30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45   pointer to an E
ce40: 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69  xprList.** obtai
ce50: 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ned from a prior
ce60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ce70: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29  ExprListAppend()
ce80: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
ce90: 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ** may not be us
cea0: 65 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c  ed with an ExprL
ceb0: 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ist obtained fro
cec0: 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  m sqlite3ExprLis
ced0: 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f  tDup()..** Reaso
cee0: 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n:  This routine
cef0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
cf00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  e number of slot
cf10: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a  s in pList->a[].
cf20: 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ** is a power of
cf30: 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74   two.  That is t
cf40: 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45  rue for sqlite3E
cf50: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20  xprListAppend() 
cf60: 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69  returns.** but i
cf70: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
cf80: 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20  y true from the 
cf90: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
cfa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cfb0: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  up()..**.** If a
cfc0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
cfd0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
cfe0: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
cff0: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
d000: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d010: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
d020: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
d030: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
d040: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
d050: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
d060: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
d070: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
d080: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
d090: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
d0a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d0b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d0c0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d0d0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d0e0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d0f0: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
d100: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d110: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
d130: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
d140: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
d150: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  NULL */.){.  str
d160: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d170: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
d180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d190: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d1a0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
d1b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
d1c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
d1d0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
d1e0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
d1f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
d200: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
d210: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d220: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
d230: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  r = 0;.  }else i
d240: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
d250: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
d260: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  -1))==0 ){.    E
d270: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
d280: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
d290: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
d2a0: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  List, .         
d2b0: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
d2c0: 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78  t)+(2*pList->nEx
d2d0: 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  pr - 1)*sizeof(p
d2e0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
d2f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
d300: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
d310: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
d320: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
d330: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d340: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d350: 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ++];.  assert( o
d360: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d370: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
d380: 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65  me)==sizeof(pIte
d390: 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61  m->pExpr) );.  a
d3a0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d3b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d3c0: 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29  item,pExpr)==0 )
d3d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65  ;.  memset(&pIte
d3e0: 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f  m->zName,0,sizeo
d3f0: 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74  f(*pItem)-offset
d400: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d410: 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b  st_item,zName));
d420: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
d430: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
d440: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
d450: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
d460: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
d470: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
d480: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
d490: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d4a0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
d4b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d4c0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
d4d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d4e0: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
d4f0: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
d500: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
d510: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
d520: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
d530: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
d540: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
d550: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
d560: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
d570: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
d580: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
d590: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
d5a0: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
d5b0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
d5c0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
d5d0: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
d5e0: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
d5f0: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
d600: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
d610: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
d620: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
d630: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
d640: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
d650: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
d660: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
d670: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d680: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
d690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d6a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d6b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d6d0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
d6e0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
d6f0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d700: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
d710: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
d720: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
d730: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
d740: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d750: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
d760: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
d770: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
d780: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
d790: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d7a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d7b0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
d7c0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
d7d0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
d7e0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
d7f0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
d800: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
d810: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
d820: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
d830: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
d840: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
d850: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
d860: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
d870: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
d880: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d890: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d8a0: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
d8b0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d8c0: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
d8d0: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
d8e0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
d8f0: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
d900: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
d910: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
d920: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
d930: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
d940: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
d950: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
d960: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
d970: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d980: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
d990: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
d9a0: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
d9b0: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
d9c0: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
d9d0: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
d9e0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
d9f0: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
da00: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
da10: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
da20: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
da30: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
da40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
da50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
da60: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
da70: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da90: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
daa0: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
dab0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
dac0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
dad0: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
dae0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
daf0: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
db00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
db10: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
db20: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
db30: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
db40: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
db50: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
db60: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
db70: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
db80: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
db90: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
dba0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
dbb0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
dbc0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
dbd0: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
dbe0: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
dbf0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
dc00: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
dc10: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
dc20: 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e  ailed && pExpr->
dc30: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
dc40: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30   ALWAYS(pList!=0
dc50: 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ) ){.    Expr *p
dc60: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
dc70: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
dc80: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
dc90: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
dca0: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
dcb0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
dcc0: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
dcd0: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
dce0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
dcf0: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
dd00: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
dd10: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
dd20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
dd30: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
dd40: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
dd50: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
dd60: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
dd70: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
dd80: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
dd90: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
dda0: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
ddb0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
ddc0: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
ddd0: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
dde0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
ddf0: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
de00: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
de10: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
de20: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
de30: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
de40: 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
de50: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
de60: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
de70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
de80: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
de90: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
dea0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
deb0: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
dec0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
ded0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
dee0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
def0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
df00: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
df10: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
df20: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
df30: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
df40: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
df50: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
df60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
df70: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
df80: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
df90: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
dfa0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
dfb0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
dfc0: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
dfd0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
dfe0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dff0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
e000: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
e010: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
e020: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
e030: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
e040: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
e050: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
e060: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e070: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
e080: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e090: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e0a0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e0b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e0c0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e0d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e0e0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e0f0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
e100: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e110: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e120: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e130: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e140: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e150: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e160: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e170: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
e180: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
e190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e1a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e1b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e1c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e1d0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e1e0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e1f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
e200: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
e210: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
e220: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
e230: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
e240: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
e250: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
e260: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
e270: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
e280: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
e290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
e2a0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
e2b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
e2c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e2d0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
e2e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e2f0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
e300: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
e310: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
e320: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
e330: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
e340: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
e350: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
e360: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
e370: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
e380: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
e390: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
e3a0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e3b0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
e3c0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
e3d0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
e3e0: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
e3f0: 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  d*)pItem->zName,
e400: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
e410: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
e420: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
e430: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
e440: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
e450: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
e460: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
e470: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
e480: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
e490: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
e4a0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
e4b0: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
e4c0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
e4d0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
e4e0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
e4f0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
e500: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
e510: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
e520: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e530: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
e540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e550: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e570: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
e580: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
e590: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
e5a0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  e span. */.  con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
e5c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
e5d0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63   the span */.  c
e5e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
e5f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e600: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a   the span */.){.
e610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e620: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
e630: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
e640: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e650: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e660: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e670: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e680: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
e690: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e6a0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e6b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e6d0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e6e0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e6f0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
e700: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
e710: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
e720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
e730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e740: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
e750: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
e760: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
e770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
e780: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
e790: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e7a0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
e7b0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
e7c0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
e7d0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
e7e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
e7f0: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
e800: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
e810: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e820: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
e830: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e840: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e850: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e860: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e870: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
e880: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
e890: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
e8a0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
e8b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e8c0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
e8d0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
e8e0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
e8f0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
e900: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
e910: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  st..*/.static SQ
e920: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
e930: 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74  id exprListDelet
e940: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
e950: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e960: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  ){.  int i = pLi
e970: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72  st->nExpr;.  str
e980: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e990: 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73  m *pItem =  pLis
e9a0: 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20  t->a;.  assert( 
e9b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e9c0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
e9d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
e9e0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
e9f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ea00: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
ea10: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ea20: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
ea30: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
ea40: 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  Item++;.  }while
ea50: 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c  ( --i>0 );.  sql
ea60: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
ea70: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
ea80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ea90: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
eaa0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
eab0: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
eac0: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
ead0: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
eae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
eaf0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
eb00: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
eb10: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
eb20: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
eb30: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
eb40: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
eb50: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
eb60: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
eb70: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73   u32 m = 0;.  as
eb80: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
eb90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
eba0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ebb0: 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45  ){.     Expr *pE
ebc0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
ebd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73  ].pExpr;.     as
ebe0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
ebf0: 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70  ;.     m |= pExp
ec00: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  r->flags;.  }.  
ec10: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
ec20: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c  ** This is a SEL
ec30: 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63  ECT-node callbac
ec40: 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  k for the expres
ec50: 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74  sion walker that
ec60: 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c  .** always "fail
ec70: 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69  s".  By "fail" i
ec80: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20  n this case, we 
ec90: 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c  mean set.** pWal
eca0: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65  ker->eCode to ze
ecb0: 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a  ro and abort..**
ecc0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
ecd0: 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c  k is used by mul
ece0: 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  tiple expression
ecf0: 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74   walkers..*/.int
ed00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
ed10: 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70  lkFail(Walker *p
ed20: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
ed30: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
ed40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
ed50: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
ed60: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
ed70: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ed80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
ed90: 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
eda0: 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20  n is an ID with 
edb0: 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20  the name "true" 
edc0: 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68  or "false".** th
edd0: 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  en convert it in
ede0: 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c  to an TK_TRUEFAL
edf0: 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  SE term.  Return
ee00: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20   non-zero if.** 
ee10: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68  the conversion h
ee20: 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72  appened, and zer
ee30: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
ee40: 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64  ion is unaltered
ee50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee60: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
ee70: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
ee80: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ee90: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
eea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  xpr->op==TK_STRI
eeb0: 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  NG );.  if( !Exp
eec0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
eed0: 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20  pr, EP_Quoted). 
eee0: 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72    && (sqlite3Str
eef0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
ef00: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
ef10: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
ef20: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ef30: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73  >u.zToken, "fals
ef40: 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  e")==0).  ){.   
ef50: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
ef60: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72  TRUEFALSE;.    r
ef70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
ef80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ef90: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
efa0: 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45  ust be a TK_TRUE
efb0: 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e  FALSE Expr node.
efc0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74    Return 1 if it
efd0: 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20   is TRUE.** and 
efe0: 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45  0 if it is FALSE
eff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f000: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63  ExprTruthValue(c
f010: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
f020: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
f030: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  pr->op==TK_TRUEF
f040: 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ALSE );.  assert
f050: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f060: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
f070: 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20  ,"true")==0.    
f080: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
f090: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
f0a0: 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30  oken,"false")==0
f0b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   );.  return pEx
f0c0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d  pr->u.zToken[4]=
f0d0: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  =0;.}.../*.** Th
f0e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f0f0: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
f100: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
f110: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
f120: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
f130: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
f140: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
f150: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
f160: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
f170: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
f180: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
f190: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
f1a0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f1c0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f1d0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f1e0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f1f0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f200: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f210: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f220: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f230: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f240: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f250: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f260: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f270: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f290: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f2b0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f2d0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f2e0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f2f0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f300: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f310: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f320: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f330: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f340: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f350: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f360: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f370: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f380: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f390: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f3a0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f3b0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f3c0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f3d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f3e0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f3f0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f400: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f410: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f420: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f440: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f450: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f460: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f470: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f480: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f490: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f4a0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f4b0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f4c0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f4d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f4e0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f4f0: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f500: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f510: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f520: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f530: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f540: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f550: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f560: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f570: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f580: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f590: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f5a0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f5b0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f5c0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f5d0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f5e0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f5f0: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f600: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f610: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f620: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f630: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f640: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f650: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f660: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f670: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f680: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f690: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f6a0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f6b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f6c0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f6d0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f6e0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f6f0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f700: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f710: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f720: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f730: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f740: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f750: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f760: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f770: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f780: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f790: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f7a0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
f7b0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
f7c0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
f7d0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
f7e0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
f7f0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f800: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
f810: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
f820: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
f830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f840: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f860: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f870: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f880: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f890: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f8a0: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
f8b0: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
f8c0: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
f8d0: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
f8e0: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
f8f0: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
f900: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
f910: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
f920: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
f930: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
f940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f950: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f960: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f970: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
f980: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
f990: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
f9a0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
f9b0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
f9c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f9d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f9e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f9f0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fa00: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fa10: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fa20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
fa30: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
fa40: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fa50: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
fa60: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
fa70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fa80: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
fa90: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
faa0: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
fab0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fac0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fad0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
fae0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
faf0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
fb00: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
fb10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fb20: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fb30: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fb40: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
fb50: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
fb60: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
fb70: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
fb80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
fba0: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fbb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fbc0: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fbd0: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fbe0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fbf0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fc00: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fc10: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fc20: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fc30: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fc40: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
fc50: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
fc60: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fc70: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fc80: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fc90: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
fca0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
fcb0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
fcc0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
fcd0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
fce0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fcf0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
fd00: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
fd10: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
fd20: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
fd30: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
fd40: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
fd50: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
fd60: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fd70: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
fd80: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
fd90: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fda0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
fdb0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
fdc0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
fdd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fde0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fdf0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
fe00: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
fe10: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
fe20: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe30: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fe40: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fe50: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fe60: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fe70: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe80: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
fe90: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fea0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
feb0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fec0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fed0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
fee0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
fef0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
ff00: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
ff10: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
ff20: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
ff30: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
ff40: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
ff50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
ff60: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ff70: 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
ff80: 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
ff90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ffa0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ffb0: 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
ffc0: 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
ffd0: 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
ffe0: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
fff0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10000 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10010 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10020 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10030 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10040 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10050 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10060 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
10070 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
10080 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
10090 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
100a0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
100b0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
100c0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
100d0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
100e0 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
100f0 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10100 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10110 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10120 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10130 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10140 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10150 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
10160 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
10170 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
10180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
10190 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
101a0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
101b0 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
101c0 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
101d0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
101e0 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
101f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10200 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10210 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10220 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10230 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10240 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
10250 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
10260 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
10270 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
10280 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
10290 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
102a0 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
102b0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
102c0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
102d0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
102e0 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
102f0 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
10300 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10310 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10320 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10330 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10340 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
10350 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
10360 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10370 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
10380 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
10390 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
103a0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
103b0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
103c0 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
103d0 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
103e0 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
103f0 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10400 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10410 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10420 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10430 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10440 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
10450 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
10460 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
10470 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
10480 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
10490 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
104a0 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
104b0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
104c0 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
104d0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
104e0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
104f0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
10500 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10510 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10520 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10530 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10540 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
10550 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
10560 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
10570 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10580 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
10590 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
105a0 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
105b0 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
105c0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
105d0 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
105e0 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
105f0 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
10600 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10610 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10620 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10630 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10640 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
10650 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
10660 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
10670 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
10680 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
10690 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
106a0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
106b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
106c0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
106d0 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
106e0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
106f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10700 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10710 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10720 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10730 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10750 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
10760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10770 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10780 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
10790 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
107a0 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
107b0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
107c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
107d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
107e0 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
107f0 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
10800 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10810 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10820 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10830 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10840 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
10850 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
10860 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
10870 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10880 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
10890 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
108a0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
108b0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
108c0 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
108d0 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
108e0 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
108f0 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
10900 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10910 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10920 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10930 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10940 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
10950 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
10960 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
10970 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
10980 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
10990 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
109a0 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
109b0 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
109c0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
109d0 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
109e0 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
109f0 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
10a00 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10a10 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10a20 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10a30 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10a40 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
10a50 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
10a60 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
10a70 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
10a80 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
10a90 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
10aa0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10ab0 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10ac0 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10ad0 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10ae0 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10af0 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10b00 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10b10 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10b20 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10b30 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10b40 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
10b50 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
10b60 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
10b70 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
10b80 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
10b90 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
10ba0 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10bb0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10bc0 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10bd0 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10be0 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10bf0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10c00 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10c10 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10c20 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10c30 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10c40 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10c50 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10c60 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10c70 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10c80 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10c90 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10ca0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10cb0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10cc0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10cd0 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10ce0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10cf0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10d00 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10d10 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10d20 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10d30 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10d40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10d50 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10d60 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10d70 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10d80 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10d90 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10da0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10dc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10dd0 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10de0 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10df0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10e00 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10e10 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10e20 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10e30 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10e40 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10e50 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10e60 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10e70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10e80 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10e90 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10ea0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
10eb0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
10ec0 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
10ed0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10ee0 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
10ef0 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10f10 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
10f20 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
10f30 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
10f40 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
10f50 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
10f60 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10f70 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
10f80 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
10f90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
10fa0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
10fb0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10fc0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10fd0 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
10fe0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
10ff0 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
11000 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
11010 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
11020 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
11030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11040 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
11050 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
11060 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11070 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11080 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
11090 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
110a0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
110b0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
110c0 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
110d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
110e0 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
110f0 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
11100 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
11110 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
11120 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
11130 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
11140 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
11150 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
11160 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
11170 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
11180 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
11190 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
111a0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
111b0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
111c0 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
111d0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
111e0 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
111f0 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
11200 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11210 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11220 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11230 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11240 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
11250 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
11260 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
11270 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11280 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11290 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
112a0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
112b0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
112c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
112d0 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
112e0 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
112f0 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
11300 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11310 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11320 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11330 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11340 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11350 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
11360 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
11370 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11380 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
11390 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
113a0 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
113b0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
113c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
113d0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
113e0 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
113f0 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
11400 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11410 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11420 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11430 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11440 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11450 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11460 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
11470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11480 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11490 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
114a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
114b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
114c0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
114d0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
114e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
114f0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
11500 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11510 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11520 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11530 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11540 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11550 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11570 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
11580 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
11590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
115a0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
115b0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
115c0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
115d0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
115e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
115f0 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
11600 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11620 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11630 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11640 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11650 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11660 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
11670 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
11680 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
11690 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
116a0 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
116b0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
116c0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
116d0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
116e0 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
116f0 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
11700 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11710 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11720 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11730 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11740 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11750 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
11760 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
11770 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
11780 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
11790 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
117a0 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
117b0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
117c0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
117d0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
117e0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
117f0 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
11800 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11810 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11820 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11830 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11840 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11850 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11860 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
11870 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
11880 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11890 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
118a0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
118b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
118c0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
118d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
118e0 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
118f0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
11900 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11910 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11920 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11930 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11940 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
11950 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
11960 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
11970 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
11980 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
11990 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
119a0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
119b0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
119c0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
119d0 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
119e0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
119f0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11a00 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11a10 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11a20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11a30 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11a40 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11a50 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11a60 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11a70 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11a80 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11a90 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11aa0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11ab0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11ac0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11ad0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11ae0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11af0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11b00 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11b10 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11b20 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11b30 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11b40 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11b50 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11b60 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11b70 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11b80 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11b90 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11ba0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11bb0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11bc0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11bd0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11be0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11bf0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11c00 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11c10 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11c20 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11c30 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11c40 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11c50 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11c60 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11c70 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11c80 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11ca0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11cb0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11cc0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11cd0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11ce0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11cf0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11d00 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11d10 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11d20 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11d30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11d40 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11d50 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11d60 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11d70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11d80 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11d90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11da0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11dc0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11dd0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11de0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11df0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11e00 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11e10 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11e20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11e30 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11e40 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11e50 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11e60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11e70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11e80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11e90 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11ea0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11eb0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11ec0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11ed0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11ee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11ef0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11f00 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11f10 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11f20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f30 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11f40 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11f50 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f60 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11f70 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11f80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11f90 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
11fa0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
11fb0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
11fc0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11fd0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11fe0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11ff0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
12000 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
12010 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
12020 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
12030 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
12040 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
12050 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
12060 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
12070 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
12080 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
12090 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
120a0 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
120b0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
120c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
120d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
120e0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
120f0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12100 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
12110 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
12120 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
12130 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
12140 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12150 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
12160 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12170 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12180 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12190 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
121a0 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
121b0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
121c0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
121d0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
121e0 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
121f0 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
12200 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12210 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12230 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12240 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
12250 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12260 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12270 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
12280 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12290 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
122a0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
122b0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
122c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
122d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
122e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
122f0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
12300 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12310 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12320 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12330 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12340 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
12350 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12360 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12380 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
12390 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
123a0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
123b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
123c0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
123d0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
123e0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
123f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12400 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12410 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12420 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12440 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
12450 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
12460 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12470 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
12480 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
12490 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
124a0 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
124b0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
124c0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
124d0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
124e0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
124f0 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
12500 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12510 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12520 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12530 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12540 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
12550 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
12560 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
12570 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12580 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
12590 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
125a0 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
125b0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
125c0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
125d0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
125e0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
125f0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
12600 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12610 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12620 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12630 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12640 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
12650 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
12660 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
12670 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12680 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
12690 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
126a0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
126b0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
126c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
126d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
126e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
126f0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12710 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12720 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12730 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12740 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12750 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12760 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12770 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
12780 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
12790 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
127a0 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
127b0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
127c0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
127d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
127e0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
127f0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
12800 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12810 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12820 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12830 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12840 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12850 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12860 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12870 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
12880 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
12890 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
128a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
128b0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
128c0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
128d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
128e0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
128f0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
12900 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12910 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12920 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12930 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12940 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12950 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12960 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12970 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
12980 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
12990 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
129a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
129b0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
129c0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
129d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
129e0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
129f0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12a00 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12a10 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12a20 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12a30 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12a40 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12a50 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12a60 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12a70 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
12a80 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
12a90 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
12aa0 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12ab0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12ac0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12ad0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12ae0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12af0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12b00 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12b10 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12b20 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12b30 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12b40 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12b50 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12b60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12b70 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
12b80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12b90 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
12ba0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12bb0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12bc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12bd0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12be0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12bf0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12c00 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12c10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12c20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12c30 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12c50 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12c60 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12c70 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12c80 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12c90 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12ca0 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12cb0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12cc0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12cd0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12ce0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12cf0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12d00 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12d10 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12d20 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12d30 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12d40 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12d50 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12d60 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12d70 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12d90 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12da0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12db0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12dc0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12de0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12df0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12e00 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12e10 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12e20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12e30 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12e40 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12e50 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12e60 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12e70 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12e80 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12e90 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12ea0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12eb0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12ec0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12ed0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12ee0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12ef0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
12f20 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
12f30 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
12f40 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
12f50 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
12f60 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
12f70 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
12fa0 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
12fb0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
12fc0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
12fd0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
12fe0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
12ff0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
13000 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
13010 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
13020 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13030 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
13040 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
13050 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
13060 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13070 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13080 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
13090 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
130a0 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
130b0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
130c0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
130d0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
130e0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
130f0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
13100 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
13110 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
13120 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
13130 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
13140 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
13150 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
13160 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
13170 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
13180 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
13190 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
131a0 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
131b0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
131c0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
131d0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
131e0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
131f0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
13200 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13210 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13220 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13230 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13240 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
13250 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
13260 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
13270 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
13280 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
13290 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
132a0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
132b0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
132c0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
132d0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
132e0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
132f0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
13300 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13310 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13320 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13330 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13340 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
13350 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
13360 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
13370 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
13380 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
13390 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
133a0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
133b0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
133c0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
133d0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
133e0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
133f0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
13400 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13410 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13420 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13430 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13440 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
13450 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
13460 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
13470 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
13480 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
13490 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
134a0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
134b0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
134c0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
134d0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
134e0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
134f0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
13500 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13510 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13520 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13530 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13540 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
13550 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
13560 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13570 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
13580 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
13590 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
135a0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
135b0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
135c0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
135d0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
135e0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
135f0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
13600 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13610 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13620 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13630 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13640 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
13650 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
13660 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
13670 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
13680 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
13690 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
136a0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
136b0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
136c0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
136d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
136e0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
136f0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
13700 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13710 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13720 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13730 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13740 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13750 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13760 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13770 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
13780 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
13790 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
137a0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
137b0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
137c0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
137d0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
137e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
137f0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
13800 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13810 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13820 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13830 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13840 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13850 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13860 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13870 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
13880 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13890 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
138a0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
138b0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
138c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
138d0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
138e0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
138f0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13900 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13910 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13920 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13930 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13940 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13950 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13960 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13970 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
13980 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
13990 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
139a0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
139b0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
139c0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
139d0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
139e0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
139f0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13a00 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13a10 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13a20 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13a30 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13a40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13a50 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13a60 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13a70 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
13a80 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
13a90 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
13aa0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13ab0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13ac0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13ad0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13ae0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13af0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13b00 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13b10 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13b20 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13b30 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13b40 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13b50 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13b60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13b70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
13b90 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
13ba0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13bb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13bc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13bd0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13bf0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13c00 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13c10 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13c20 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13c30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13c40 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13c50 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13c60 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13c70 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13c80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13c90 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13ca0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13cb0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13cc0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13cd0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13ce0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13cf0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13d00 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d20 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13d30 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13d40 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13d70 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13d80 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13d90 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13dc0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13dd0 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13de0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13df0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13e00 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13e10 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13e20 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13e50 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13e60 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13e70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e80 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13e90 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13ea0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13eb0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13ec0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13ed0 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13ee0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13ef0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13f00 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
13f10 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
13f20 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
13f30 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
13f40 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
13f50 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
13f60 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
13f70 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
13f80 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
13f90 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
13fa0 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
13fb0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
13fc0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
13fd0 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
13fe0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
13ff0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
14000 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
14010 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
14020 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
14030 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
14040 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
14050 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
14060 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
14070 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14080 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
14090 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
140a0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
140b0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
140c0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
140d0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
140e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
140f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
14100 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
14110 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
14120 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14130 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
14140 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
14150 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
14160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14170 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
14180 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14190 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
141a0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
141b0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
141c0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
141d0 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
141e0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
141f0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
14200 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14210 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14220 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14230 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14240 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14250 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14270 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14280 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
14290 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142b0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
142c0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142f0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
14300 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14310 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14320 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14330 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14340 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
14350 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14360 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
14370 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14380 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14390 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
143a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
143b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
143c0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
143d0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
143e0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
143f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
14400 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14410 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14420 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14430 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14440 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
14450 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
14460 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
14470 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
14480 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
14490 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
144a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
144b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
144c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
144d0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
144e0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
144f0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
14500 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14510 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14520 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14530 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14540 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
14550 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
14560 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
14570 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
14580 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
14590 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
145a0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
145b0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
145c0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
145d0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
145e0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
145f0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
14600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14610 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14620 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14630 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14640 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
14650 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
14660 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
14670 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
14680 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14690 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
146a0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
146b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
146c0 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
146d0 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
146e0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
146f0 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
14700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14710 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14720 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14730 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14740 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14760 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14770 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14780 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
14790 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
147a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
147b0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
147c0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
147d0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
147e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
147f0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
14800 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14810 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14820 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14830 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14840 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
14850 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
14860 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14870 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
14880 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
14890 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
148a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
148b0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
148c0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
148d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
148e0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
148f0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
14900 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14910 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14920 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14930 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14940 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14950 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14960 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
14970 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
14980 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14990 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
149a0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
149b0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
149c0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
149d0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
149e0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
149f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14a00 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14a10 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14a20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14a30 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14a40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14a50 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
14a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14a70 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14a80 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
14a90 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
14aa0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14ab0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14ac0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14ad0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14ae0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14af0 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14b00 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14b10 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14b30 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14b40 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
14b50 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
14b60 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
14b70 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
14b80 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
14b90 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14ba0 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14bb0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14bd0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14be0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14c00 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14c10 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14c20 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14c30 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14c40 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14c50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14c60 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14c70 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14c80 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14c90 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14ca0 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14cb0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14cc0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14cd0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14ce0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14cf0 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14d00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14d10 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14d20 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14d30 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14d40 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14d50 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14d70 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14d80 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14d90 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14da0 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14db0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14dc0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14dd0 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14de0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14df0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14e00 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14e10 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14e20 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14e30 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14e40 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14e50 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14e60 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14e70 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14e80 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14e90 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14ea0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14eb0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14ed0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14ef0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14f00 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14f10 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14f20 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
14f30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
14f40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
14f50 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
14f60 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
14f70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14f80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14f90 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
14fa0 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
14fb0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14fc0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14fe0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14ff0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
15000 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
15010 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
15020 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
15030 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
15040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15050 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
15060 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15070 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
15080 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
15090 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
150a0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
150b0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
150c0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
150d0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
150e0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
150f0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
15100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
15110 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
15120 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
15130 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
15140 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
15150 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
15160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
15170 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
15180 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
15190 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
151a0 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
151b0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
151c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
151d0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
151e0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
151f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15200 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15210 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15220 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15230 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
15250 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15290 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
152a0 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
152b0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
152c0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
152d0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
152e0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
152f0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
15300 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15310 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15320 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15340 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
15350 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
15360 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
15370 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
15380 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
15390 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
153a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
153b0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
153c0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
153d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
153e0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
153f0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
15400 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15410 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15420 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15430 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15440 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
15450 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
15460 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15470 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
15480 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
154b0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
154c0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
154d0 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
154e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15500 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15510 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15520 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15530 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15540 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15550 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
15560 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15570 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
15580 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15590 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
155a0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
155b0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
155c0 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
155d0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
155e0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
155f0 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
15600 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15610 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15620 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15630 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15640 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
15650 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15660 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
15670 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
15680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15690 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
156a0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
156b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156c0 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
156d0 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
156e0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
156f0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
15700 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15710 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15720 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15730 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15750 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15760 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
15770 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
15780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
157a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
157b0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
157c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
157d0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
157e0 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
157f0 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
15800 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15810 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15820 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15830 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15840 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15850 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
15860 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
15870 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
15880 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
15890 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
158a0 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
158b0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
158c0 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
158d0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
158e0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
158f0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
15900 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15910 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15920 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15930 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15940 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15950 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
15960 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
15970 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
15980 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
15990 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
159a0 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
159b0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
159c0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
159d0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
159e0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
159f0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15a00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15a10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15a20 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15a30 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15a40 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15a50 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
15a60 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
15a70 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
15a80 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
15a90 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
15aa0 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15ab0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15ac0 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15ad0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15ae0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15af0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15b00 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15b10 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15b30 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15b40 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15b50 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
15b60 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
15b70 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15b80 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
15b90 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
15ba0 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15bb0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15bc0 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d  yLoop = 0;.    }
15bd0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15be0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15bf0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15c00 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15c10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15c20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15c30 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15c40 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15c50 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15c60 70 58 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 69  pX, iTab);.    i
15c70 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
15c80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c90 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15ca0 2c 20 69 54 61 62 2c 20 72 4d 61 79 48 61 76 65  , iTab, rMayHave
15cb0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
15cc0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
15cd0 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
15ce0 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69 66  yLoop;.  }..  if
15cf0 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
15d00 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
15d10 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
15d20 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
15d30 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
15d40 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
15d50 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15d60 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
15d70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15d80 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
15d90 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 61 62 20  i;.  }.  *piTab 
15da0 3d 20 69 54 61 62 3b 0a 20 20 72 65 74 75 72 6e  = iTab;.  return
15db0 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
15dc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15dd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15de0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
15df0 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
15e00 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
15e10 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
15e20 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
15e30 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
15e40 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
15e50 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
15e60 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
15e70 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
15e80 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
15e90 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
15ea0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
15eb0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15ec0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
15ed0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
15ee0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
15ef0 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
15f00 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
15f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
15f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
15f30 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
15f40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15f50 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
15f60 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
15f70 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
15f80 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
15f90 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
15fa0 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
15fb0 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
15fc0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
15fd0 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
15fe0 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
15ff0 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
16000 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16010 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
16020 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
16030 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  MallocRaw(pParse
16040 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
16050 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
16060 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
16070 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
16080 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16090 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
160a0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
160b0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
160c0 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
160d0 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
160e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
160f0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
16100 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
16110 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16120 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16130 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
16140 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16150 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
16160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16170 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
16180 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
16190 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
161a0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
161b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
161c0 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
161d0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
161e0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
161f0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
16200 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
16210 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
16220 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
16230 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16240 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16250 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
16260 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
16270 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
16280 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
16290 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
162a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
162b0 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
162c0 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
162d0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
162e0 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
162f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
16300 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
16310 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
16320 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
16330 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63  n pExpr is a vec
16340 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65  tor that has bee
16350 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  n used in a cont
16360 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ext where.** it 
16370 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
16380 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  . If pExpr is a 
16390 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f  sub-select vecto
163a0 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
163b0 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61  .** loads the Pa
163c0 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20  rse object with 
163d0 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  a message of the
163e0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
163f0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
16400 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
16410 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a  xpected 1".**.**
16420 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20   Or, if it is a 
16430 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76  regular scalar v
16440 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ector:.**.**   "
16450 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
16460 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  d".*/   .void sq
16470 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
16480 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
16490 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
164a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
164b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
164c0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
164d0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
164e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75  ){.    sqlite3Su
164f0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
16500 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
16510 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16520 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Expr, 1);.  }els
16530 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
16540 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16550 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
16560 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
16570 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
16580 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16590 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
165a0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
165b0 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 65 70   construct an ep
165c0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 6f  hemeral table co
165d0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 65 72  ntaining all ter
165e0 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20 52 48 53  ms.** in the RHS
165f0 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
16600 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  or.  The IN oper
16610 61 74 6f 72 20 63 61 6e 20 62 65 20 69 6e 20 65  ator can be in e
16620 69 74 68 65 72 20 6f 66 20 74 77 6f 0a 2a 2a 20  ither of two.** 
16630 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
16640 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
16650 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
16660 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
16670 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
16680 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
16690 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
166a0 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
166b0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
166c0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
166d0 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
166e0 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
166f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16700 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
16710 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20  mber for the.** 
16720 63 6f 6e 73 74 72 75 63 74 65 64 20 65 70 68 65  constructed ephe
16730 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  rmeral table is 
16740 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 66  returned.  The f
16750 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 65 70  irst time the ep
16760 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
16770 20 69 73 20 63 6f 6d 70 75 74 65 64 2c 20 74 68   is computed, th
16780 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
16790 69 73 20 61 6c 73 6f 20 73 74 6f 72 65 64 20 69  is also stored i
167a0 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  n pExpr->iTable,
167b0 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74 68 65 20  .** however the 
167c0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 72 65  cursor number re
167d0 74 75 72 6e 65 64 20 6d 69 67 68 74 20 6e 6f 74  turned might not
167e0 20 62 65 20 74 68 65 20 73 61 6d 65 2c 20 61 73   be the same, as
167f0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76   it might.** hav
16800 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65  e been duplicate
16810 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70 65 6e 44  d using OP_OpenD
16820 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  up..**.** If the
16830 20 4c 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   LHS expression 
16840 28 22 78 22 20 69 6e 20 74 68 65 20 65 78 61 6d  ("x" in the exam
16850 70 6c 65 73 29 20 69 73 20 61 20 63 6f 6c 75 6d  ples) is a colum
16860 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74  n value, or.** t
16870 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16880 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
16890 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
168a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
168b0 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20   that.** column 
168c0 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
168d0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
168e0 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
168f0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e   the.** SELECT..
16900 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16910 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16920 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
16930 73 20 75 73 65 64 0a 2a 2a 20 69 66 20 65 69 74  s used.** if eit
16940 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
16950 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
16960 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
16970 65 69 74 68 65 72 0a 2a 2a 20 27 78 27 20 6e 6f  either.** 'x' no
16980 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
16990 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
169a0 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
169b0 72 69 63 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ric affinity.** 
169c0 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
169d0 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f   sqlite3CodeRhsO
169e0 66 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  fIN(.  Parse *pP
169f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16a00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16a10 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
16a20 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
16a30 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
16a40 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  r */.  int iTab 
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a60 2a 20 55 73 65 20 74 68 69 73 20 63 75 72 73 6f  * Use this curso
16a70 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
16a80 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
16a90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
16aa0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
16ab0 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
16ac0 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69  on at top */.  i
16ad0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
16ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16af0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
16b00 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
16b10 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
16b20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
16b30 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48         /* the LH
16b40 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16b50 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  ator */.  KeyInf
16b60 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
16b70 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
16b80 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  ormation */.  in
16b90 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  t nVal;         
16ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16bb0 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66  e of vector pLef
16bc0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
16bf0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
16c00 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
16c10 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  */..  v = pParse
16c20 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
16c30 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
16c40 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
16c50 6f 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62  of the IN must b
16c60 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
16c70 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
16c80 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
16c90 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
16ca0 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
16cb0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
16cc0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16cd0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
16ce0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
16cf0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16d00 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
16d10 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
16d20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
16d30 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
16d40 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
16d50 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
16d60 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
16d70 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
16d80 20 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d   then we can com
16d90 70 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73  pute the RHS jus
16da0 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20  t once.  ** and 
16db0 72 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61  reuse it many na
16dc0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mes..  */.  if( 
16dd0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16de0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
16df0 6c 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d  lect) && pParse-
16e00 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a  >iSelfTab==0 ){.
16e10 20 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20      /* Reuse of 
16e20 74 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77  the RHS is allow
16e30 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ed */.    /* If 
16e40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
16e50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
16e60 64 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65  ded, but the pre
16e70 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a  vious code.    *
16e80 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  * might not have
16e90 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65   been invoked ye
16ea0 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20  t, so invoke it 
16eb0 6e 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74  now as a subrout
16ec0 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ine. .    */.   
16ed0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16ee0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
16ef0 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20  ubrtn) ){.      
16f00 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
16f10 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
16f20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
16f30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
16f40 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16f50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
16f60 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
16f70 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16f80 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
16f90 2c 20 22 52 45 55 53 45 20 4c 49 53 54 20 53 55  , "REUSE LIST SU
16fa0 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
16fb0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16fc0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
16fd0 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d));.      }.   
16fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ff0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
17000 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
17010 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  egReturn,.      
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17040 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
17050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17060 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54  , OP_OpenDup, iT
17070 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ab, pExpr->iTabl
17080 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
17090 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
170a0 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
170b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
170c0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
170d0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
170e0 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  ine */.    ExprS
170f0 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
17100 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
17110 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72    pExpr->y.sub.r
17120 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
17130 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
17140 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
17150 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r =.      sqlite
17160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17170 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45  P_Integer, 0, pE
17180 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
17190 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56  turn) + 1;.    V
171a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
171b0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29  return address")
171c0 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65  );..    addrOnce
171d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
171e0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
171f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17200 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
17210 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
17220 73 20 69 73 20 61 20 76 65 63 74 6f 72 20 49 4e  s is a vector IN
17230 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70   operator */.  p
17240 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17250 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71  eft;.  nVal = sq
17260 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
17270 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a 20 20 2f  ize(pLeft);..  /
17280 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
17290 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
172a0 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69  that will contai
172b0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
172c0 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68 65  .  ** RHS of the
172d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
172e0 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  */.  pExpr->iTab
172f0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64 64  le = iTab;.  add
17300 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17320 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
17330 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61 6c 29 3b  ->iTable, nVal);
17340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17350 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
17360 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20 45 78 70  MMENTS.  if( Exp
17370 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17380 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17390 29 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ) ){.    VdbeCom
173a0 6d 65 6e 74 28 28 76 2c 20 22 52 65 73 75 6c 74  ment((v, "Result
173b0 20 6f 66 20 53 45 4c 45 43 54 20 25 75 22 2c 20   of SELECT %u", 
173c0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
173d0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c  ->selId));.  }el
173e0 73 65 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  se{.    VdbeComm
173f0 65 6e 74 28 28 76 2c 20 22 52 48 53 20 6f 66 20  ent((v, "RHS of 
17400 49 4e 20 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a  IN operator"));.
17410 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65    }.#endif.  pKe
17420 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
17430 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
17440 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29  se->db, nVal, 1)
17450 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
17460 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17470 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17480 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
17490 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
174a0 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a  ECT ...).    **.
174b0 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
174c0 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
174d0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
174e0 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
174f0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
17500 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
17510 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
17520 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53  ve..    */.    S
17530 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
17540 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
17550 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  t;.    ExprList 
17560 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  *pEList = pSelec
17570 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t->pEList;..    
17580 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
17590 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
175a0 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25 64  LIST SUBQUERY %d
175b0 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  ",.        addrO
175c0 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  nce?"":"CORRELAT
175d0 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e 73  ED ", pSelect->s
175e0 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20 20  elId.    ));.   
175f0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
17600 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
17610 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
17620 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
17630 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
17640 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
17650 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
17660 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
17670 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41   */.    if( ALWA
17680 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
17690 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
176a0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
176b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
176c0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
176d0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
176e0 2c 20 53 52 54 5f 53 65 74 2c 20 69 54 61 62 29  , SRT_Set, iTab)
176f0 3b 0a 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66  ;.      dest.zAf
17700 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
17710 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
17720 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 53 65  Expr);.      pSe
17730 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
17740 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17750 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
17760 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
17770 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
17780 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
17790 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
177a0 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
177b0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
177c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
177d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
177e0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
177f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17800 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
17810 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
17820 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  dst);.        sq
17830 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
17840 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
17850 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
17860 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17870 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
17880 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
17890 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
178a0 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
178b0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
178c0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
178d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
178e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
178f0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
17900 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
17910 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
17920 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
17930 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
17940 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
17950 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
17960 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
17970 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
17980 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
17990 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
179a0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  t, i);.        p
179b0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
179c0 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
179d0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
179e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
179f0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e  rse, p, pEList->
17a00 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20  a[i].pExpr.     
17a10 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
17a20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17a30 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
17a40 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
17a50 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17a60 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17a70 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t).    **.    **
17a80 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
17a90 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
17aa0 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
17ab0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
17ac0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74  .    ** store it
17ad0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
17ae0 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
17af0 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
17b00 74 68 65 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20  then use.    ** 
17b10 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17b20 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17b30 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17b40 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17b50 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e  .    ** a column
17b60 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
17b70 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
17b80 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
17b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17ba0 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
17bb0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
17bc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
17bd0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17be0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17bf0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  ;.    struct Exp
17c00 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17c10 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72  m;.    int r1, r
17c20 32 2c 20 72 33 3b 0a 20 20 20 20 61 66 66 69 6e  2, r3;.    affin
17c30 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17c40 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17c50 3b 0a 20 20 20 20 69 66 28 20 21 61 66 66 69 6e  ;.    if( !affin
17c60 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61 66 66  ity ){.      aff
17c70 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
17c80 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
17c90 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
17ca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17cb0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
17cc0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
17cd0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b  nfo) );.      pK
17ce0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
17cf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17d00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17d10 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17d20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20   }..    /* Loop 
17d30 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17d40 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
17d50 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31  list>. */.    r1
17d60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17d70 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17d80 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
17d90 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17da0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73  ;.    for(i=pLis
17db0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
17dc0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
17dd0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
17de0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
17df0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
17e00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
17e10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
17e20 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
17e30 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
17e40 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
17e50 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
17e60 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
17e70 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
17e80 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  e.      ** this 
17e90 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
17ea0 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
17eb0 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
17ec0 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78  tant.      ** ex
17ed0 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17ee0 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17ef0 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17f00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
17f10 28 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73  ( addrOnce && !s
17f20 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
17f30 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
17f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17f50 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
17f60 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
17f70 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b     addrOnce = 0;
17f80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17f90 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
17fa0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
17fb0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
17fc0 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
17fd0 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
17fe0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17ff0 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
18000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18010 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
18020 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
18030 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
18040 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
18050 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
18060 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
18070 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72 33 2c  t, iTab, r2, r3,
18080 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
18090 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
180a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
180b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
180c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
180d0 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20 69  se, r2);.  }.  i
180e0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
180f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18100 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
18110 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f  (void *)pKeyInfo
18120 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
18130 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f 6e 63   }.  if( addrOnc
18140 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
18150 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18160 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 2f  addrOnce);.    /
18170 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
18180 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  urn */.    sqlit
18190 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
181a0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70 72  OP_Return, pExpr
181b0 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
181c0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
181d0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 70  dbeChangeP1(v, p
181e0 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
181f0 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  r-1, sqlite3Vdbe
18200 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
18210 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
18220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
18230 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
18240 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18250 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
18260 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
18270 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
18280 69 6f 6e 0a 2a 2a 20 6f 72 20 45 58 49 53 54 53  ion.** or EXISTS
18290 20 6f 70 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a   operator:.**.**
182a0 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
182b0 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
182c0 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
182d0 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
182e0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
182f0 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
18300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
18310 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
18320 65 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  e SELECT or EXIS
18330 54 53 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  TS operator to b
18340 65 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  e coded..**.** T
18350 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
18360 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
18370 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
18380 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a  column SELECT, .
18390 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
183a0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e   stored in a con
183b0 74 69 67 75 6f 75 73 20 61 72 72 61 79 20 6f 66  tiguous array of
183c0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
183d0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
183e0 75 65 20 69 73 20 74 68 65 20 72 65 67 69 73 74  ue is the regist
183f0 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  er of the left-m
18400 6f 73 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ost result colum
18410 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
18420 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18430 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
18440 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18450 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
18460 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
18470 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
18480 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 61  *pExpr){.  int a
18490 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20  ddrOnce = 0;    
184a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
184b0 73 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20  s of OP_Once at 
184c0 74 6f 70 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  top of subroutin
184d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  e */.  int rReg 
184e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
184f0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
18500 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
18510 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
18520 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
18530 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
18540 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
18550 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
18560 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
18570 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
18580 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
18590 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  lt */.  int nReg
185a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
185b0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
185c0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
185d0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185f0 20 4e 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65   New limit expre
18600 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65  ssion */..  Vdbe
18610 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18620 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
18630 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
18640 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
18650 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 74 65 73  _EXISTS );.  tes
18660 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
18670 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
18680 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18690 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
186a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
186b0 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72  ELECT );.  asser
186c0 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
186d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
186e0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 53 65  Select) );.  pSe
186f0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
18700 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  lect;..  /* The 
18710 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
18720 65 20 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  e EXISTS/SELECT 
18730 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
18740 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
18750 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
18760 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
18770 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
18780 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
18790 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
187a0 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
187b0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
187c0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
187d0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
187e0 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
187f0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
18800 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
18810 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
18820 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
18830 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
18840 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
18850 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
18860 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
18870 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
18880 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
18890 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
188a0 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
188b0 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
188c0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
188d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
188e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
188f0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f  Select) ){.    /
18900 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
18910 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
18920 65 6e 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69  en coded, then i
18930 6e 76 6f 6b 65 20 69 74 20 61 73 20 61 0a 20 20  nvoke it as a.  
18940 20 20 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e    ** subroutine.
18950 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
18960 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18970 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b  r, EP_Subrtn) ){
18980 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
18990 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
189a0 20 30 2c 20 22 52 45 55 53 45 20 53 55 42 51 55   0, "REUSE SUBQU
189b0 45 52 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73  ERY %d", pSel->s
189c0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
189d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
189e0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78  v, OP_Gosub, pEx
189f0 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
18a00 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  urn,.           
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
18a20 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29  pr->y.sub.iAddr)
18a30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
18a40 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
18a50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69    }..    /* Begi
18a60 6e 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62  n coding the sub
18a70 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45  routine */.    E
18a80 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
18a90 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
18aa0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73  ;.    pExpr->y.s
18ab0 75 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  ub.regReturn = +
18ac0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18ad0 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
18ae0 69 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71  iAddr =.      sq
18af0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18b00 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
18b10 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
18b20 65 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20  egReturn) + 1;. 
18b30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18b40 76 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65  v, "return addre
18b50 73 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72  ss"));..    addr
18b60 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
18b70 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
18b80 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
18b90 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ge(v);.  }.  .  
18ba0 2f 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  /* For a SELECT,
18bb0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
18bc0 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
18bd0 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
18be0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   of.  ** the fir
18bf0 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61  st row into an a
18c00 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
18c10 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
18c20 20 69 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74   index of.  ** t
18c30 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
18c40 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  r..  **.  ** If 
18c50 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
18c60 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
18c70 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
18c80 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
18c90 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  .  ** into a reg
18ca0 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e  ister and return
18cb0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
18cc0 75 6d 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  umber..  **.  **
18cd0 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
18ce0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
18cf0 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
18d00 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a  IT 1".  Any .  *
18d10 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
18d20 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
18d30 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
18d40 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
18d50 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  */.  ExplainQuer
18d60 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
18d70 2c 20 22 25 73 53 43 41 4c 41 52 20 53 55 42 51  , "%sSCALAR SUBQ
18d80 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
18d90 20 20 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43    addrOnce?"":"C
18da0 4f 52 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65  ORRELATED ", pSe
18db0 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52  l->selId));.  nR
18dc0 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  eg = pExpr->op==
18dd0 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c  TK_SELECT ? pSel
18de0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
18df0 3a 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  : 1;.  sqlite3Se
18e00 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
18e10 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  st, 0, pParse->n
18e20 4d 65 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73 65  Mem+1);.  pParse
18e30 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
18e40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
18e50 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
18e60 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
18e70 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74  RT_Mem;.    dest
18e80 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  .iSdst = dest.iS
18e90 44 50 61 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e  DParm;.    dest.
18ea0 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
18eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ec0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
18ed0 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  0, dest.iSDParm,
18ee0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52   dest.iSDParm+nR
18ef0 65 67 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  eg-1);.    VdbeC
18f00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
18f10 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
18f20 22 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  "));.  }else{.  
18f30 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
18f40 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 73  RT_Exists;.    s
18f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18f60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18f70 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
18f80 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
18f90 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
18fa0 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
18fb0 7d 0a 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c  }.  pLimit = sql
18fc0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
18fd0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
18fe0 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74  EGER,&sqlite3Int
18ff0 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
19000 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69   if( pSel->pLimi
19010 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
19020 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
19030 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
19040 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  mit->pLeft);.   
19050 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
19060 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  Left = pLimit;. 
19070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c   }else{.    pSel
19080 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
19090 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
190a0 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74  TK_LIMIT, pLimit
190b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c  , 0);.  }.  pSel
190c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
190d0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
190e0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
190f0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 72 65  &dest) ){.    re
19100 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
19110 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 52  xpr->iTable = rR
19120 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  eg = dest.iSDPar
19130 6d 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41 50  m;.  ExprSetVVAP
19140 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19150 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 69  P_NoReduce);.  i
19160 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20  f( addrOnce ){. 
19170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
19180 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
19190 63 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62  ce);..    /* Sub
191a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 2a  routine return *
191b0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
191c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
191d0 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73  turn, pExpr->y.s
191e0 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  ub.regReturn);. 
191f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19200 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72 2d  angeP1(v, pExpr-
19210 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c 20  >y.sub.iAddr-1, 
19220 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19230 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20  ntAddr(v)-1);.  
19240 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67  }..  return rReg
19250 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
19260 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19270 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
19280 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19290 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70  ERY./*.** Expr p
192a0 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29  In is an IN(...)
192b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69   expression. Thi
192c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
192d0 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73  s that the .** s
192e0 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65  ub-select on the
192f0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
19300 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68   operator has th
19310 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
19320 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20   .** columns as 
19330 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68  the vector on th
19340 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68  e LHS. Or, if th
19350 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
19360 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73  ) is not .** a s
19370 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74  ub-query, that t
19380 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74  he LHS is a vect
19390 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f  or of size 1..*/
193a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
193b0 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70  CheckIN(Parse *p
193c0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e  Parse, Expr *pIn
193d0 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  ){.  int nVector
193e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
193f0 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c  ctorSize(pIn->pL
19400 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  eft);.  if( (pIn
19410 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
19420 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
19430 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d  f( nVector!=pIn-
19440 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
19450 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
19460 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
19470 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
19480 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d   pIn->x.pSelect-
19490 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
194a0 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20  nVector);.      
194b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
194c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63    }else if( nVec
194d0 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71  tor!=1 ){.    sq
194e0 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
194f0 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  Msg(pParse, pIn-
19500 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74  >pLeft);.    ret
19510 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
19520 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
19530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19540 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
19550 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19560 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72  e for an IN expr
19570 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
19580 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
19590 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49  ...).**      x I
195a0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
195b0 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
195c0 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28  left-hand side (
195d0 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72  LHS) is a scalar
195e0 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65   or vector expre
195f0 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20  ssion.  The .** 
19600 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
19610 28 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61  (RHS) is an arra
19620 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
19630 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c  e scalar values,
19640 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72   or a.** subquer
19650 79 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  y.  If the RHS i
19660 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
19670 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
19680 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a  lt columns must.
19690 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ** match the num
196a0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
196b0 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  n the vector on 
196c0 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65  the LHS.  If the
196d0 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73   RHS is.** a lis
196e0 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65  t of values, the
196f0 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   LHS must be a s
19700 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  calar. .**.** Th
19710 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
19720 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
19730 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69   value is contai
19740 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
19750 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  HS..** The resul
19760 74 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  t is false if th
19770 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74  e LHS is definit
19780 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  ely not in the R
19790 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73  HS.  The .** res
197a0 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ult is NULL if t
197b0 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74  he presence of t
197c0 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48  he LHS in the RH
197d0 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20  S cannot be .** 
197e0 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74  determined due t
197f0 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54  o NULLs..**.** T
19800 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
19810 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
19820 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46  jumps to destIfF
19830 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
19840 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61  is not .** conta
19850 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
19860 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20  RHS.  If due to 
19870 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20  NULLs we cannot 
19880 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
19890 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61   LHS.** is conta
198a0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
198b0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73  then jump to des
198c0 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65  tIfNull.  If the
198d0 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
198e0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
198f0 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  RHS then fall th
19900 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  rough..**.** See
19910 20 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e   the separate in
19920 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63  -operator.md doc
19930 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20  umentation file 
19940 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  in the canonical
19950 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63  .** SQLite sourc
19960 65 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74  e tree for addit
19970 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19980 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
19990 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
199a0 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
199b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
199c0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
199d0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
199e0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
199f0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
19a00 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
19a10 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
19a20 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
19a30 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
19a40 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
19a50 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
19a60 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
19a70 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
19a80 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
19a90 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
19aa0 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
19ab0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
19ac0 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
19ad0 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
19ae0 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
19af0 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
19b00 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  s */.  int eType
19b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19b20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
19b30 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20  */.  int rLhs;  
19b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19b50 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e  gister(s) holdin
19b60 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73  g the LHS values
19b70 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72   */.  int rLhsOr
19b80 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ig;         /* L
19b90 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20  HS values prior 
19ba0 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79  to reordering by
19bb0 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64   aiMap[] */.  Vd
19bc0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
19bd0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
19be0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19bf0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ion */.  int *ai
19c00 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Map = 0;       /
19c10 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f  * Map from vecto
19c20 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78  r field to index
19c30 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
19c40 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20  r *zAff = 0;    
19c50 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
19c60 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72  tring for compar
19c70 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  isons */.  int n
19c80 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Vector;         
19c90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
19ca0 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ors for this IN 
19cb0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
19cc0 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20  t iDummy;       
19cd0 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72      /* Dummy par
19ce0 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f  ameter to exprCo
19cf0 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20  deVector() */.  
19d00 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
19d10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
19d20 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
19d30 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  tor */.  int i; 
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d50 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * loop counter *
19d60 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
19d70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  2;        /* Whe
19d80 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20  re to jump when 
19d90 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74  NULLs seen in st
19da0 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ep 2 */.  int de
19db0 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20  stStep6 = 0;    
19dc0 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
19dd0 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20   for Step 6 */. 
19de0 20 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70   int addrTruthOp
19df0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
19e00 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74  s of opcode that
19e10 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
19e20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  IN is true */.  
19e30 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b  int destNotNull;
19e40 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19e50 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73  re if a comparis
19e60 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69  on is not true i
19e70 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  n step 6 */.  in
19e80 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
19e90 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
19ea0 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f  e step-6 loop */
19eb0 20 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 30   .  int iTab = 0
19ec0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
19ed0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20  ex to use */..  
19ee0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
19ef0 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Left;.  if( sqli
19f00 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
19f10 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
19f20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d  return;.  zAff =
19f30 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
19f40 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
19f50 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
19f60 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
19f70 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
19f80 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
19f90 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
19fa0 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
19fb0 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
19fc0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
19fd0 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
19fe0 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  .  );.  if( pPar
19ff0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1a000 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69  iled ) goto sqli
1a010 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
1a020 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41  m_error;..  /* A
1a030 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74  ttempt to comput
1a040 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72  e the RHS. After
1a050 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61   this step, if a
1a060 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
1a070 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58  an.  ** IN_INDEX
1a080 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
1a090 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65  d, the table ope
1a0a0 6e 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ned with cursor 
1a0b0 69 54 61 62 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  iTab.  ** contai
1a0c0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
1a0d0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
1a0e0 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
1a0f0 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
1a100 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
1a110 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1a120 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
1a130 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1a140 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1a150 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
1a160 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
1a170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
1a180 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1a190 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
1a1a0 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
1a1b0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
1a1c0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
1a1d0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
1a200 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
1a210 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
1a240 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
1a250 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
1a260 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll,.            
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 61 69 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a   aiMap, &iTab);.
1a290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a2a0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
1a2b0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
1a2c0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
1a2d0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
1a2e0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
1a2f0 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
1a300 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
1a310 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
1a320 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f  TE_DEBUG.  /* Co
1a330 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70  nfirm that aiMap
1a340 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63  [] contains nVec
1a350 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75  tor integer valu
1a360 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
1a370 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e  .  ** nVector-1.
1a380 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1a390 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1a3a0 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a      int j, cnt;.
1a3b0 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b      for(cnt=j=0;
1a3c0 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29   j<nVector; j++)
1a3d0 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69   if( aiMap[j]==i
1a3e0 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73   ) cnt++;.    as
1a3f0 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a  sert( cnt==1 );.
1a400 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a410 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
1a420 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
1a430 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
1a440 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
1a450 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
1a460 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
1a470 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
1a480 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
1a490 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
1a4a0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20  * at r1..  **.  
1a4b0 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  ** sqlite3FindIn
1a4c0 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61  Index() might ha
1a4d0 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65  ve reordered the
1a4e0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c   fields of the L
1a4f0 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73  HS vector.  ** s
1a500 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64  o that the field
1a510 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  s are in the sam
1a520 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78  e order as an ex
1a530 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20  isting index.   
1a540 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d  The.  ** aiMap[]
1a550 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
1a560 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  a mapping from t
1a570 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20  he original LHS 
1a580 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20  field order to. 
1a590 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72   ** the field or
1a5a0 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73  der that matches
1a5b0 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a   the RHS index..
1a5c0 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20    */.  rLhsOrig 
1a5d0 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  = exprCodeVector
1a5e0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1a5f0 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28  &iDummy);.  for(
1a600 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26  i=0; i<nVector &
1a610 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69  & aiMap[i]==i; i
1a620 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53  ++){} /* Are LHS
1a630 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65   fields reordere
1a640 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e  d? */.  if( i==n
1a650 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a  Vector ){.    /*
1a660 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20   LHS fields are 
1a670 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f  not reordered */
1a680 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73  .    rLhs = rLhs
1a690 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Orig;.  }else{. 
1a6a0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1a6b0 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69  order the LHS fi
1a6c0 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74  elds according t
1a6d0 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72  o aiMap */.    r
1a6e0 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Lhs = sqlite3Get
1a6f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1a700 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a710 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a720 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
1a730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a740 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c  3(v, OP_Copy, rL
1a750 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61  hsOrig+i, rLhs+a
1a760 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  iMap[i], 0);.   
1a770 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1a780 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a790 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
1a7a0 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
1a7b0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
1a7c0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
1a7d0 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
1a7e0 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
1a7f0 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
1a800 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
1a810 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
1a820 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
1a830 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65   step (1) in the
1a840 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
1a850 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69  optimized algori
1a860 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  thm..  */.  if( 
1a870 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a880 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
1a890 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
1a8a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1a8b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1a8c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a8d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
1a8e0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1a8f0 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
1a900 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a910 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
1a920 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
1a930 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
1a940 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
1a950 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
1a960 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1a970 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1a980 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1a990 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
1a9a0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1a9b0 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
1a9c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a9d0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1a9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a9f0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
1aa00 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
1aa10 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
1aa20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1aa30 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1aa40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
1aa50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aa60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
1aa70 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
1aa80 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
1aa90 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
1aaa0 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
1aab0 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
1aac0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
1aad0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aae0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1aaf0 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
1ab00 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
1ab10 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1ab20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
1ab30 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
1ab40 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
1ab50 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
1ab60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1ab70 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
1ab80 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
1abb0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1abc0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1abd0 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
1abe0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
1abf0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1ac00 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
1ac10 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
1ac20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ac30 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1ac40 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
1ac50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
1ac60 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
1ac70 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
1ac80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ac90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1aca0 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
1acb0 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1ace0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
1acf0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ad00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad10 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1ad20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
1ad30 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1ad40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ad50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ad60 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
1ad70 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
1ad80 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
1ad90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ada0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1adb0 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
1adc0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
1add0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ade0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1adf0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
1ae00 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
1ae10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ae20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1ae30 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
1ae40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ae50 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
1ae60 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
1ae70 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
1ae80 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
1ae90 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
1aea0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
1aeb0 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
1aec0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
1aed0 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
1aee0 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
1aef0 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
1af00 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
1af10 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
1af20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
1af30 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
1af40 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
1af50 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
1af60 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
1af70 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
1af80 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
1af90 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
1afa0 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
1afb0 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
1afc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1afd0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  l(pParse);.  }. 
1afe0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1aff0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
1b000 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
1b010 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
1b020 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
1b030 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   i);.    if( sql
1b040 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1b050 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  l(p) ){.      sq
1b060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b070 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c  v, OP_IsNull, rL
1b080 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29  hs+i, destStep2)
1b090 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1b0a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
1b0b0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e   }..  /* Step 3.
1b0c0 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77    The LHS is now
1b0d0 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
1b0e0 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62  -NULL.  Do the b
1b0f0 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a  inary search.  *
1b100 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69  * of the RHS usi
1b110 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20  ng the LHS as a 
1b120 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64  probe.  If found
1b130 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  , the result is.
1b140 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a    ** true..  */.
1b150 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
1b160 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
1b170 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
1b180 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
1b190 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
1b1a0 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20  e b-tree and so 
1b1b0 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b  we also.    ** k
1b1c0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53  now that the RHS
1b1d0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48   is non-NULL.  H
1b1e0 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65  ence, we combine
1b1f0 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20   steps 3 and 4. 
1b200 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e     ** into a sin
1b210 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  gle opcode. */. 
1b220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b230 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
1b240 6f 77 69 64 2c 20 69 54 61 62 2c 20 64 65 73 74  owid, iTab, dest
1b250 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
1b260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b270 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
1b280 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
1b290 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
1b2a0 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
1b2b0 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
1b2c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b2d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
1b2e0 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
1b2f0 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
1b300 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
1b310 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
1b320 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
1b330 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
1b340 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
1b350 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
1b360 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
1b370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1b380 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
1b390 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b3a0 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alse,.          
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3c0 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
1b3d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b3e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c  ;.      goto sql
1b3f0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
1b400 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
1b410 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53     /* Ordinary S
1b420 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63  tep 3, for the c
1b430 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45 20  ase where FALSE 
1b440 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73  and NULL are dis
1b450 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64  tinct */.    add
1b460 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
1b470 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1b480 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
1b490 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  b, 0,.          
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1b4c0 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1b4d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1b4e0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20  ..  /* Step 4.  
1b4f0 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e  If the RHS is kn
1b500 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1b510 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f  LL and we did no
1b520 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d  t find.  ** an m
1b530 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72  atch on the sear
1b540 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  ch above, then t
1b550 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1b560 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20  e FALSE..  */.  
1b570 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  if( rRhsHasNull 
1b580 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b  && nVector==1 ){
1b590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b5a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1b5b0 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
1b5c0 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  l, destIfFalse);
1b5d0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1b5e0 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
1b5f0 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64  Step 5.  If we d
1b600 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1b610 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1b620 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64  between NULL and
1b630 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65  .  ** FALSE, the
1b640 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61  n just return fa
1b650 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  lse. .  */.  if(
1b660 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1b670 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74  stIfNull ) sqlit
1b680 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1b690 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f  stIfFalse);..  /
1b6a0 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74  * Step 6: Loop t
1b6b0 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74  hrough rows of t
1b6c0 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65  he RHS.  Compare
1b6d0 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65   each row to the
1b6e0 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e   LHS..  ** If an
1b6f0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  y comparison is 
1b700 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
1b710 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  esult is NULL.  
1b720 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70  If all.  ** comp
1b730 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53  arisons are FALS
1b740 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c  E then the final
1b750 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45   result is FALSE
1b760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
1b770 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74  a scalar LHS, it
1b780 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
1b790 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65  o check just the
1b7a0 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20   first row.  ** 
1b7b0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1b7c0 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36  .  if( destStep6
1b7d0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
1b7e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1b7f0 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72  stStep6);.  addr
1b800 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1b810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1b820 77 69 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74  wind, iTab, dest
1b830 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65  IfFalse);.  Vdbe
1b840 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
1b850 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1b860 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
1b870 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b880 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
1b890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b8a0 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20  For nVector==1, 
1b8b0 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20  combine steps 6 
1b8c0 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61  and 7 by immedia
1b8d0 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20  tely returning. 
1b8e0 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
1b8f0 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
1b900 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  son is not NULL 
1b910 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  */.    destNotNu
1b920 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  ll = destIfFalse
1b930 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b940 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
1b950 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
1b960 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1b970 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20  l;.    int r3 = 
1b980 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1b990 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
1b9a0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
1b9b0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
1b9c0 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c  ft, i);.    pCol
1b9d0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1b9e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1b9f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ba00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1ba10 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20  olumn, iTab, i, 
1ba20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r3);.    sqlite3
1ba30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ba40 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  _Ne, rLhs+i, des
1ba50 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20  tNotNull, r3,.  
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1ba80 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1ba90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1baa0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1bab0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1bac0 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20  arse, r3);.  }. 
1bad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bae0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1baf0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1bb00 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29   if( nVector>1 )
1bb10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1bb20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1bb30 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20   destNotNull);. 
1bb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bb50 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1bb60 20 69 54 61 62 2c 20 61 64 64 72 54 6f 70 2b 31   iTab, addrTop+1
1bb70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1bb80 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
1bb90 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
1bba0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1bbb0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1bbc0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
1bbd0 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
1bbe0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1bbf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1bc00 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
1bc10 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
1bc20 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
1bc30 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
1bc40 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
1bc50 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1bc60 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
1bc70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1bc80 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
1bc90 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
1bca0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1bcb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1bcc0 4c 68 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Lhs);.  VdbeComm
1bcd0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
1bce0 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33  expr"));.sqlite3
1bcf0 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
1bd00 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
1bd10 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1bd20 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69  , aiMap);.  sqli
1bd30 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1bd40 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23  ->db, zAff);.}.#
1bd50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1bd60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1bd70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1bd80 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1bd90 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
1bda0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1bdb0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1bdc0 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
1bdd0 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
1bde0 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
1bdf0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
1be00 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
1be10 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
1be20 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
1be30 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
1be40 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
1be50 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
1be60 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1be70 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
1be80 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
1be90 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
1bea0 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
1beb0 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1bec0 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
1bed0 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
1bee0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
1bef0 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
1bf00 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
1bf10 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
1bf20 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ble value;.    s
1bf30 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
1bf40 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
1bf50 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
1bf60 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
1bf70 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
1bf80 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
1bf90 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
1bfa0 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
1bfb0 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
1bfc0 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
1bfd0 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
1bfe0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
1bff0 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
1c000 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1c010 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20  lue, P4_REAL);. 
1c020 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1c030 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1c040 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1c050 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
1c060 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
1c070 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
1c080 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
1c090 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
1c0a0 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
1c0b0 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
1c0c0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
1c0d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1c0e0 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
1c0f0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1c100 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
1c110 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1c120 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1c130 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
1c140 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1c150 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
1c160 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
1c170 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
1c180 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
1c190 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
1c1a0 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
1c1b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c1c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
1c1d0 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
1c1e0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
1c1f0 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
1c200 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
1c210 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1c220 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
1c230 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
1c240 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
1c250 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
1c260 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e   if( (c==3 && !n
1c270 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32  egFlag) || (c==2
1c280 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26  ) || (negFlag &&
1c290 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54   value==SMALLEST
1c2a0 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66  _INT64)){.#ifdef
1c2b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1c2c0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1c2d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c2e0 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
1c2f0 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
1c300 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
1c310 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
1c320 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
1c330 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47  E_OMIT_HEX_INTEG
1c340 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ER.      if( sql
1c350 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
1c360 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "0x",2)==0 ){.  
1c370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c380 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68  orMsg(pParse, "h
1c390 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62  ex literal too b
1c3a0 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  ig: %s%s", negFl
1c3b0 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20  ag?"-":"",z);.  
1c3c0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1c3d0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1c3e0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
1c3f0 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
1c400 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c420 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76  if( negFlag ){ v
1c430 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d  alue = c==3 ? SM
1c440 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d  ALLEST_INT64 : -
1c450 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73  value; }.      s
1c460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c470 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34  Dup8(v, OP_Int64
1c480 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
1c490 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e  8*)&value, P4_IN
1c4a0 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T64);.    }.  }.
1c4b0 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.../* Generate 
1c4c0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c  code that will l
1c4d0 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  oad into registe
1c4e0 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65  r regOut a value
1c4f0 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72   that is.** appr
1c500 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
1c510 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  iIdxCol-th colum
1c520 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
1c530 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c540 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
1c550 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  xColumn(.  Parse
1c560 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68   *pParse,  /* Th
1c570 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1c580 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
1c590 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx,    /* The in
1c5a0 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e  dex whose column
1c5b0 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64   is to be loaded
1c5c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1c5d0 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r,    /* Cursor 
1c5e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
1c5f0 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ble row */.  int
1c600 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20   iIdxCol,    /* 
1c610 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  The column of th
1c620 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f  e index to be lo
1c630 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  aded */.  int re
1c640 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f  gOut      /* Sto
1c650 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  re the index col
1c660 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69  umn value in thi
1c670 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1c680 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d  .  i16 iTabCol =
1c690 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1c6a0 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20  iIdxCol];.  if( 
1c6b0 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52  iTabCol==XN_EXPR
1c6c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c6d0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
1c6e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1c6f0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45  dx->aColExpr->nE
1c700 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20  xpr>iIdxCol );. 
1c710 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c720 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20  Tab = iTabCur + 
1c730 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  1;.    sqlite3Ex
1c740 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
1c750 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  e, pIdx->aColExp
1c760 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
1c770 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  xpr, regOut);.  
1c780 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
1c790 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ab = 0;.  }else{
1c7a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c7b0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c7c0 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1c7d0 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1c7e0 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c810 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1c820 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1c830 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1c840 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1c850 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1c860 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1c870 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c880 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c890 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1c8a0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1c8b0 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1c8c0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1c8d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1c8e0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1c8f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1c900 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1c910 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1c920 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1c930 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1c940 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1c950 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1c960 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c970 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1c980 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1c990 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1c9a0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1c9b0 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1c9c0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1c9d0 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
1c9e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c9f0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1ca00 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
1ca10 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  regOut);.    ret
1ca20 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
1ca30 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1ca40 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1ca50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ca60 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1ca70 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1ca80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ca90 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1caa0 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1cab0 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1cac0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1cad0 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1cae0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1caf0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1cb00 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1cb10 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1cb20 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1cb30 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1cb40 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1cb50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb60 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1cb70 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1cb80 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1cb90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1cba0 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1cbb0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1cbc0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1cbd0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cbe0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1cbf0 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1cc00 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1cc10 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1cc20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1cc30 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1cc40 65 72 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20  er iReg. .**.** 
1cc50 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1cc60 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
1cc70 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
1cc80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1cc90 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
1cca0 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
1ccb0 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
1ccc0 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
1ccd0 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
1cce0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1ccf0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
1cd00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1cd10 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1cd20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1cd30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1cd40 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
1cd50 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1cd60 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
1cd70 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
1cd80 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
1cd90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1cda0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1cdb0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1cdc0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
1cdd0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1cde0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1cdf0 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
1ce00 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
1ce10 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70  s here */.  u8 p
1ce20 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5            /* 
1ce30 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
1ce40 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a  Column + FLAGS *
1ce50 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
1ce60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ce70 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1ce80 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1ce90 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1cea0 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
1ceb0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1cec0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
1ced0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cee0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
1cef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1cf00 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
1cf10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1cf20 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1cf30 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1cf40 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1cf50 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1cf60 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f  To+nReg-1..*/.vo
1cf70 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cf80 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
1cf90 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1cfa0 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
1cfb0 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  eg){.  assert( i
1cfc0 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
1cfd0 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
1cfe0 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
1cff0 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
1d000 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
1d010 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
1d020 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  g);.}../*.** Con
1d030 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78  vert a scalar ex
1d040 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
1d050 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72   a TK_REGISTER r
1d060 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65  eferencing.** re
1d070 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1d080 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
1d090 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61  sure that iReg a
1d0a0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a  lready contains.
1d0b0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  ** the correct v
1d0c0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70  alue for the exp
1d0d0 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ression..*/.stat
1d0e0 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
1d0f0 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
1d100 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
1d110 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1d120 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1d130 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1d140 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1d150 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1d160 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1d170 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1d180 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1d190 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1d1a0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1d1b0 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1d1c0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1d1d0 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1d1e0 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1d1f0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1d200 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1d210 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1d220 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d230 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1d240 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1d250 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1d260 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1d270 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1d280 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1d290 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1d2a0 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1d2b0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1d2c0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1d2d0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1d2e0 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1d2f0 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1d300 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1d310 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1d320 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1d330 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1d340 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1d350 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1d360 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1d370 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1d380 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1d390 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1d3a0 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1d3b0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1d3c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1d3d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1d3e0 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1d3f0 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1d400 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1d410 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1d420 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ){.#if SQLITE_OM
1d430 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1d440 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23    iResult = 0;.#
1d450 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75  else.      iResu
1d460 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1d470 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1d480 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , p);.#endif.   
1d490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1d4a0 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1d4b0 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1d4c0 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1d4d0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1d4e0 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1d4f0 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1d500 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1d510 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1d520 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1d530 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1d540 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1d550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1d570 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1d580 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1d590 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1d5a0 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1d5b0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1d5c0 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1d5d0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1d5e0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1d5f0 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1d600 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1d610 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1d620 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1d630 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1d640 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1d650 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1d660 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1d670 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1d680 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1d690 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1d6a0 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1d6b0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1d6c0 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1d6d0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1d6e0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1d6f0 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1d700 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1d710 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1d720 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1d730 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1d740 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1d750 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1d760 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d770 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1d780 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1d790 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d7a0 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1d7b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1d7c0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7e0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1d7f0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1d800 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1d810 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1d820 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1d830 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1d840 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1d850 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1d860 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1d870 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1d880 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1d890 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1d8a0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1d8b0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1d8c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1d8d0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1d8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8f0 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1d900 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1d910 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1d920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1d930 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1d940 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1d950 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1d960 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1d970 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1d980 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1d990 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1d9a0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1d9b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1d9c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1d9d0 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1d9e0 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1d9f0 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1da00 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1da10 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1da20 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1da30 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1da40 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1da50 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1da60 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1da70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1da80 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1da90 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1daa0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1dab0 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1dac0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1dad0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1dae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1daf0 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1db00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1db10 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1db20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1db30 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1db40 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1db50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1db60 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1db70 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1db80 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1dbb0 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1dbc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1dbd0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1dbe0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1dbf0 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1dc00 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1dc10 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1dc20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1dc30 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1dc40 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1dc50 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1dc60 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1dc70 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
1dc80 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
1dc90 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65  /* This COLUMN e
1dca0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 61  xpression is rea
1dcb0 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20 64  lly a constant d
1dcc0 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75  ue to WHERE clau
1dcd0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  se.        ** co
1dce0 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
1dcf0 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  hat constant is 
1dd00 63 6f 64 65 64 20 62 79 20 74 68 65 20 70 45 78  coded by the pEx
1dd10 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
1dd20 20 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f 6e    ** expresssion
1dd30 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65  .  However, make
1dd40 20 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74 61   sure the consta
1dd50 6e 74 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  nt has the corre
1dd60 63 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ct.        ** da
1dd70 74 61 74 79 70 65 20 62 79 20 61 70 70 6c 79 69  tatype by applyi
1dd80 6e 67 20 74 68 65 20 41 66 66 69 6e 69 74 79 20  ng the Affinity 
1dd90 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1dda0 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 20  umn to the.     
1ddb0 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a     ** constant..
1ddc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ddd0 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73 71     int iReg = sq
1dde0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ddf0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1de00 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74 29  r->pLeft,target)
1de10 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 66  ;.        int af
1de20 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
1de30 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
1de40 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45  Expr->y.pTab, pE
1de50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1de60 20 20 20 20 20 20 20 69 66 28 20 61 66 66 21 3d         if( aff!=
1de70 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
1de80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1de90 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1dea0 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c  Aff[] = "B\000C\
1deb0 30 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20  000D\000E";.    
1dec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1ded0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27  LITE_AFF_BLOB=='
1dee0 41 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  A' );.          
1def0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1df00 46 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a  FF_TEXT=='B' );.
1df10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
1df20 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1df30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1df40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1df50 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74  P_SCopy, iReg, t
1df60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1df70 20 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65      iReg = targe
1df80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1df90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1dfa0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1dfb0 5f 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c  _Affinity, iReg,
1dfc0 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42     &zAff[(aff-'B
1dff0 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43  ')*2], P4_STATIC
1e000 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e010 20 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67       return iReg
1e020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e030 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1e040 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1e050 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a  ->iSelfTab<0 ){.
1e060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1e070 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1e080 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1e090 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1e0a0 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1e0b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1e0c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  xpr->iColumn - p
1e0d0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1e0e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1e100 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1e110 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1e120 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1e130 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1e140 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1e150 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1e160 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1e170 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1e180 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1e190 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1e1a0 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a  ->iSelfTab - 1;.
1e1b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e1c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1e1d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1e1e0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1e1f0 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20  pExpr->y.pTab,. 
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e220 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1e230 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e260 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1e270 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1e280 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1e290 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1e2a0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1e2b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e2c0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1e2d0 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c   case TK_TRUEFAL
1e2e0 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1e2f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e300 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c   OP_Integer, sql
1e310 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
1e320 75 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65  ue(pExpr), targe
1e330 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e340 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e360 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e370 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e380 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e390 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e3a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e3b0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e3c0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e3d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1e3e0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e3f0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e400 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e410 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1e420 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e430 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e440 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e450 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e460 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1e470 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1e480 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e490 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e4a0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e4b0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1e4c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e4d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e4e0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1e4f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e500 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1e510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e520 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1e530 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1e540 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1e550 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e560 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1e570 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1e580 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e590 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e5a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e5b0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e5c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e5d0 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1e5e0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1e5f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e600 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1e610 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1e620 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1e630 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1e640 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1e650 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1e660 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1e670 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1e680 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1e690 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1e6a0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1e6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e6c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1e6d0 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1e6e0 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1e6f0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1e700 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e710 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e720 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1e730 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e740 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e750 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e760 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1e770 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e780 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1e790 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e7a0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1e7b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e7c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e7d0 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1e7e0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1e7f0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1e800 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1e810 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1e820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1e830 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1e840 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1e850 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1e860 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1e870 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e880 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1e890 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1e8a0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1e8b0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1e8c0 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1e8d0 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1e8e0 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1e8f0 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1e900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e910 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1e920 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1e930 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1e940 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e960 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1e970 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1e980 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1e990 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e9a0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1e9b0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1e9c0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1e9d0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1e9e0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1e9f0 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1ea00 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1ea10 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1ea20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ea30 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1ea40 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1ea50 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1ea60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ea70 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1ea80 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1ea90 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1eaa0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1eab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1ead0 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1eb00 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1eb10 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1eb20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1eb30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1eb40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1eb50 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1eb60 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1eb70 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1eb80 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1eb90 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1eba0 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1ebb0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1ebc0 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1ebd0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1ebe0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1ebf0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1ec00 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1ec10 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1ec20 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1ec30 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1ec40 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1ec50 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1ec60 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1ec70 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1ec80 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1ec90 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1eca0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1ecb0 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1ecc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1ecd0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ece0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ecf0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1ed00 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1ed10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ed20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ed30 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1ed40 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1ed50 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1ed60 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1ed70 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1ed80 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1ed90 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1eda0 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1edb0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1edc0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1edd0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1ede0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1edf0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1ee00 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1ee10 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1ee20 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1ee30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ee40 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1ee50 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1ee60 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1ee70 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1ee80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ee90 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1eea0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1eeb0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1eec0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1eed0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1eee0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1eef0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1ef00 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1ef10 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1ef20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ef30 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1ef40 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1ef50 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1ef60 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1ef70 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ef80 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1ef90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1efa0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1efb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1efc0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1efd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1efe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1eff0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1f000 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1f010 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1f020 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1f030 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1f040 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1f050 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1f060 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1f070 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1f080 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1f090 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1f0a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1f0b0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1f0c0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1f0d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1f0e0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1f0f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f100 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1f110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f120 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1f130 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f140 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1f150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f160 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1f170 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1f180 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1f190 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1f1a0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1f1b0 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1f1c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f1d0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1f1e0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1f1f0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1f200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f210 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1f220 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f230 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1f240 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f250 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1f260 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f270 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1f280 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1f290 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f2a0 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1f2b0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1f2c0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1f2d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f2e0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1f2f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1f300 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1f310 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1f320 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1f330 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f340 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1f350 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1f360 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f370 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1f380 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1f390 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1f3a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f3b0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1f3c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f3d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f3e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f3f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f400 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f410 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f420 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f430 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f440 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f450 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1f460 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1f470 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f480 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f4a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f4b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f4c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f4d0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1f4e0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1f4f0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1f500 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1f510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1f520 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1f530 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1f540 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1f550 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1f560 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1f570 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1f580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f590 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1f5a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f5b0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1f5c0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1f5d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f5e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f5f0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1f600 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1f610 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1f620 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1f630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1f640 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1f650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f660 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1f670 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1f680 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1f690 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1f6a0 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1f6b0 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1f6c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1f6d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f6e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1f6f0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1f700 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1f710 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f720 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f730 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f740 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1f750 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f760 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1f770 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1f780 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f790 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1f7b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f7c0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1f7d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1f7e0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f7f0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1f800 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1f810 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1f820 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1f830 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1f840 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1f850 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1f860 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1f870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f880 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f890 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f8a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1f8b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f8c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f8d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f8e0 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1f8f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f900 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f910 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
1f920 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a  nt isTrue;    /*
1f930 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
1f940 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
1f950 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20   int bNormal;   
1f960 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1f970 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
1f980 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f990 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f9a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f9b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f9c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f9d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f9e0 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
1f9f0 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1fa00 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1fa10 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70       bNormal = p
1fa20 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
1fa30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fa40 28 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72  ( isTrue && bNor
1fa50 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mal);.      test
1fa60 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
1fa70 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fa80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fa90 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72  p4Int(v, OP_IsTr
1faa0 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21  ue, r1, inReg, !
1fab0 69 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e  isTrue, isTrue ^
1fac0 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fae0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1faf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1fb00 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
1fb10 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
1fb20 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
1fb30 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
1fb40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fb50 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1fb60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1fb70 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
1fb80 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
1fb90 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1fba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fbb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1fbc0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1fbd0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1fbe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fbf0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1fc00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1fc10 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1fc20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1fc30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
1fc40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc50 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
1fc60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1fc70 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1fc80 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1fc90 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1fca0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1fcb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fcc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1fcd0 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
1fce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fcf0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1fd00 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
1fd10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fd20 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1fd30 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1fd40 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
1fd50 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1fd60 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
1fd70 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1fd80 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1fd90 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1fda0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1fdb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fdc0 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
1fdd0 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
1fde0 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
1fdf0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1fe00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1fe10 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75  eturn pInfo->aFu
1fe20 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
1fe30 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
1fe40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fe50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
1fe60 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
1fe70 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
1fe80 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1fe90 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1fea0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
1feb0 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
1fec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fed0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1fee0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
1fef0 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
1ff00 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
1ff10 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
1ff20 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63  bject */.      c
1ff30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
1ff40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
1ff50 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1ff60 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
1ff70 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
1ff80 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
1ff90 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
1ffa0 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
1ffb0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1ffc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ffd0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1ffe0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1fff0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
20000 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
20010 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
20020 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
20030 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
20040 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
20050 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
20060 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
20070 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
20080 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
20090 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
200a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
200b0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
200c0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
200d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
200e0 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
200f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
20100 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65  Expr->y.pWin->re
20110 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d  gResult;.      }
20120 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
20130 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
20140 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69  (pParse) && sqli
20150 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
20160 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
20170 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ){.        /* SQ
20180 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
20190 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f  be expensive. So
201a0 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e   try to move con
201b0 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a  stant functions.
201c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f          ** out o
201d0 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
201e0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
201f0 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50  eans an extra OP
20200 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20  _Copy. */.      
20210 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20220 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
20230 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
20240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20250 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20260 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20270 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
20280 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
20290 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
202a0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
202b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
202c0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
202d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
202e0 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
202f0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
20300 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
20310 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
20320 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
20330 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20340 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
20350 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
20360 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
20370 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
20380 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20390 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
203a0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
203b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
203c0 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
203d0 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
203e0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
203f0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
20400 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
20410 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20420 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
20430 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
20440 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
20450 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
20460 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
20470 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
20480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
20490 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
204a0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
204b0 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
204c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
204d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
204e0 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
204f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20500 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
20510 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
20520 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
20530 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
20540 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
20550 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
20560 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
20570 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
20580 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
20590 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
205a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
205b0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
205c0 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
205d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
205e0 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
205f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20600 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
20610 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
20620 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
20630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20640 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20650 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20660 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
20670 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
20680 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
20690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
206a0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
206b0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
206c0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
206d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
206e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
206f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20700 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
20710 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20730 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20740 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
20750 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20770 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
20780 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
20790 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
207a0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
207b0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
207c0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
207d0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
207e0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
207f0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20800 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
20810 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
20820 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
20830 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20840 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20850 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
20860 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20870 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20880 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
20890 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
208a0 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
208b0 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
208c0 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
208d0 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
208e0 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
208f0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
20900 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
20910 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
20920 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
20930 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
20940 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
20950 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20960 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20970 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
20980 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20990 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
209a0 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
209b0 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
209c0 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
209d0 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
209e0 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
209f0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20a00 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
20a10 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
20a20 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
20a30 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
20a40 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
20a50 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
20a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20a80 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
20a90 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
20aa0 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
20ab0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
20ac0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20ad0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
20ae0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
20af0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
20b00 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
20b10 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
20b20 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
20b30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20b40 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
20b50 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
20b60 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
20b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20b80 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20b90 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20ba0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
20bb0 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
20bc0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
20bd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20be0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
20bf0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
20c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20c10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
20c20 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
20c30 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
20c40 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
20c50 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
20c60 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
20c70 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
20c80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20c90 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
20ca0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20cb0 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
20cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20cd0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
20ce0 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
20cf0 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
20d00 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
20d10 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
20d20 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
20d30 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
20d40 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
20d50 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
20d60 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
20d70 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
20d80 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
20d90 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
20da0 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
20db0 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
20dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
20dd0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20de0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
20df0 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
20e00 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
20e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
20e20 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
20e30 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20e40 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
20e50 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
20e60 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
20e70 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
20e80 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
20e90 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
20ea0 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
20eb0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
20ec0 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
20ed0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
20ee0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
20ef0 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
20f00 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
20f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
20f20 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
20f30 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
20f40 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
20f50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
20f60 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
20f70 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
20f80 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
20f90 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
20fa0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
20fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20fc0 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
20fd0 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
20fe0 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
20ff0 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
21000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21020 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
21030 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
21040 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r1, 0,.         
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
21070 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
21080 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
21090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
210a0 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
210b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
210c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
210d0 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
210e0 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
210f0 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
21100 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21110 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
21120 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
21130 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
21140 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
21150 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
21160 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
21170 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
21180 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
21190 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
211a0 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
211b0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
211c0 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
211d0 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
211e0 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
211f0 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
21200 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
21210 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
21220 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
21230 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
21240 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
21250 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
21260 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
21270 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
21280 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21290 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
212a0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
212b0 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
212c0 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
212d0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
212e0 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
212f0 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
21300 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
21310 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
21320 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
21330 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
21340 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
21350 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
21360 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
21370 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
21380 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
21390 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 66 69  y(pExpr, EP_Infi
213a0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
213b0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
213c0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
213d0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
213e0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
213f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21400 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
21410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
21420 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
21430 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
21440 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
21450 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21460 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
21470 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
21480 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21490 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
214a0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
214b0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
214c0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
214d0 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
214e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
214f0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
21500 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
21510 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
21520 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
21530 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21540 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a  OFFSET_SQL_FUNC.
21550 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
21560 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21570 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29  TE_FUNC_OFFSET )
21580 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
21590 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b  pArg = pFarg->a[
215a0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
215b0 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d    if( pArg->op==
215c0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
215d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
215e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
215f0 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61  ffset, pArg->iTa
21600 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75  ble, pArg->iColu
21610 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
21620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21640 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21650 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21670 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
21680 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c     {.        sql
21690 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
216a0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  , pParse->iSelfT
216b0 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63  ab ? OP_PureFunc
216c0 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  0 : OP_Function0
216d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
216e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
216f0 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
21700 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  t, (char*)pDef, 
21710 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
21720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21730 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
21740 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
21750 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
21760 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
21770 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21780 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
21790 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
217a0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
217b0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
217c0 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
217d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
217e0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
217f0 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
21800 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
21810 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
21820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21830 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
21840 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21850 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
21870 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e  =TK_SELECT && (n
21880 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Col = pExpr->x.p
21890 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
218a0 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20  nExpr)!=1 ){.   
218b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
218c0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
218d0 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  e, nCol, 1);.   
218e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218f0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21900 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
21910 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
21920 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
21930 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21940 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
21950 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
21960 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  n;.      if( pEx
21970 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21980 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21990 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
219a0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  able = sqlite3Co
219b0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
219c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
219d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
219e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
219f0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
21a00 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
21a10 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
21a20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
21a30 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
21a40 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
21a50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
21a60 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
21a70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
21a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21aa0 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
21ab0 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
21ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
21af0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
21b00 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
21b10 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
21b20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21b40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
21b50 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
21b60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21b70 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
21b80 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
21b90 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
21ba0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
21bb0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21bc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21bd0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
21be0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21bf0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
21c00 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
21c10 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
21c20 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
21c30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21c40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
21c50 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
21c60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21c70 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
21c80 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
21c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21ca0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
21cb0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
21cc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21cd0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
21ce0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
21cf0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
21d00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
21d10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21d20 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
21d30 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
21d40 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
21d50 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
21d60 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
21d70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
21d80 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
21d90 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
21da0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21db0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
21dc0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21dd0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
21de0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
21df0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21e00 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
21e10 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
21e20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
21e30 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
21e40 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
21e50 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
21e60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
21e70 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21e80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21e90 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
21ea0 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
21eb0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
21ec0 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
21ed0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
21ee0 20 20 20 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64     goto expr_cod
21ef0 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31  e_doover; /* 201
21f00 38 2d 30 34 2d 32 38 3a 20 50 72 65 76 65 6e 74  8-04-28: Prevent
21f10 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 2e   deep recursion.
21f20 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20   OSSFuzz. */.   
21f30 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
21f40 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
21f50 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
21f60 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
21f70 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
21f80 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
21f90 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
21fa0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
21fb0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
21fc0 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
21fd0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
21fe0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
21ff0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
22000 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
22010 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
22020 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
22030 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
22040 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
22050 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
22060 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
22070 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
22080 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
22090 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
220a0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
220b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
220c0 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
220d0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
220e0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
220f0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22100 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
22110 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
22120 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
22130 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
22140 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
22150 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
22160 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
22170 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
22180 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
22190 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
221a0 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
221b0 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
221c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
221d0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
221e0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
221f0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
22200 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
22210 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
22220 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
22230 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
22240 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
22250 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
22260 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
22270 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22280 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
22290 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
222a0 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
222b0 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
222c0 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
222d0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
222e0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
222f0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
22300 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
22310 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
22320 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
22330 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
22340 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
22350 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
22360 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22370 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
22380 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
22390 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
223a0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
223b0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
223c0 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
223d0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
223e0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
223f0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
22400 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
22410 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
22420 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
22430 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
22440 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
22450 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
22460 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
22470 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79  *pTab = pExpr->y
22480 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  .pTab;.      int
22490 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
224a0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
224b0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
224c0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
224d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
224e0 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
224f0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
22500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22510 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22520 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
22530 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
22540 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22550 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
22560 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
22570 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
22580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22590 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
225a0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
225b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
225c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
225d0 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
225e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
225f0 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25  ent((v, "r[%d]=%
22600 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20  s.%s", target,. 
22610 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22620 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
22630 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
22640 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
22650 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
22660 78 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f  xpr->y.pTab->aCo
22670 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
22680 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29  ].zName).      )
22690 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
226a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
226b0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
226c0 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
226d0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
226e0 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
226f0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
22700 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
22710 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
22720 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
22730 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
22740 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
22750 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
22760 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
22770 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
22780 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
22790 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
227a0 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
227b0 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
227c0 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
227d0 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
227e0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
227f0 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
22800 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
22810 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
22820 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
22830 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
22840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22850 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22860 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
22870 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
22880 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
22890 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
228a0 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a  se TK_VECTOR: {.
228b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
228c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
228d0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
228e0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
228f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
22900 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
22910 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
22920 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72  rINR;.      addr
22930 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62  INR = sqlite3Vdb
22940 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
22950 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e  NullRow, pExpr->
22960 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69  iTable);.      i
22970 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
22980 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
22990 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
229a0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
229b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
229c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52  pHere(v, addrINR
229d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
229e0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
229f0 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b  addrINR, inReg);
22a00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22a10 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
22a20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a  ** Form A:.    *
22a30 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20  *   CASE x WHEN 
22a40 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22a50 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22a60 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22a70 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22a80 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a  .    ** Form B:.
22a90 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
22aa0 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
22ab0 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
22ac0 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
22ad0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22ae0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
22af0 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e  A is can be tran
22b00 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65  sformed into the
22b10 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d   equivalent form
22b20 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20   B as follows:. 
22b30 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
22b40 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57  N x=e1 THEN r1 W
22b50 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32  HEN x=e2 THEN r2
22b60 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20   ....    **     
22b70 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45     WHEN x=eN THE
22b80 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
22b90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
22ba0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
22bb0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  s in pExpr->pLef
22bc0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69  t..    ** Y is i
22bd0 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  n the last eleme
22be0 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70  nt of pExpr->x.p
22bf0 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78  List if pExpr->x
22c00 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73  .pList->nExpr is
22c10 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68  .    ** odd.  Th
22c20 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
22c30 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75  onal.  If the nu
22c40 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
22c50 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20   in x.pList.    
22c60 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e  ** is even, then
22c70 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e   Y is omitted an
22c80 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65  d the "otherwise
22c90 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  " result is NULL
22ca0 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
22cb0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22cc0 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
22cd0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
22ce0 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
22cf0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
22d00 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
22d10 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
22d20 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
22d30 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
22d40 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
22d50 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
22d60 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
22d70 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
22d80 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
22d90 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
22da0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
22db0 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53  sert( op==TK_CAS
22dc0 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  E ); {.      int
22dd0 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22df0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
22e00 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
22e10 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
22e20 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e40 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
22e50 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
22e60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
22e70 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
22e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
22e90 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
22ea0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
22eb0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22ee0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
22ef0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22f10 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
22f20 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
22f30 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
22f40 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
22f50 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
22f60 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
22f70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f90 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
22fa0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
22fb0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
22fe0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
22ff0 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
23020 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
23030 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20  orm B) */..     
23040 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23050 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23060 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
23070 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
23080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23090 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
230a0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
230b0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
230c0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
230d0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
230e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
230f0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
23100 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
23110 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
23120 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
23130 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  se);.      if( (
23140 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
23150 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
23160 20 65 78 70 72 4e 6f 64 65 43 6f 70 79 28 26 74   exprNodeCopy(&t
23170 65 6d 70 58 2c 20 70 58 29 3b 0a 20 20 20 20 20  empX, pX);.     
23180 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
23190 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
231a0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
231b0 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c  Register(&tempX,
231c0 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
231d0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
231e0 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20  &regFree1));.   
231f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
23200 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
23210 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70        memset(&op
23220 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65  Compare, 0, size
23230 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a  of(opCompare));.
23240 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23250 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
23260 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23270 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a  pLeft = &tempX;.
23280 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
23290 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
232a0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
232b0 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
232c0 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
232d0 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
232e0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
232f0 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
23300 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
23310 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
23320 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
23330 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
23340 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
23350 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
23360 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
23370 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
23380 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
23390 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
233a0 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
233b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
233c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
233d0 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
233e0 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
233f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23400 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
23410 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
23420 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
23430 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
23440 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23450 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
23460 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23470 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
23480 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
23490 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
234a0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
234b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
234c0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
234d0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
234e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
234f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
23500 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
23510 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23520 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23530 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
23540 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
23550 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23560 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23570 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
23580 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
23590 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
235a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
235b0 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
235c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
235d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
235e0 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
235f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23600 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
23610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23620 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23630 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
23640 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23650 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23680 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
23690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
236a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
236b0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
236c0 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
236d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
236e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
236f0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
23700 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
23710 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
23720 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
23730 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
23740 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
23750 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
23760 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
23770 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23780 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
23790 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
237a0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
237b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
237c0 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
237d0 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
237e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
237f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
23820 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
23830 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
23840 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
23850 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
23860 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23870 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23880 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
23890 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
238a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
238b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
238c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
238d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
238e0 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
238f0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23900 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
23910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23920 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
23930 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
23940 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
23950 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
23960 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
23970 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
23980 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
23990 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
239a0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
239b0 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
239c0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
239d0 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
23a00 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
23a10 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
23a20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
23a30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
23a40 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
23a50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23a60 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
23a70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23a80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23a90 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
23aa0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
23ab0 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
23ac0 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
23ad0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
23ae0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23af0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  time..**.** If r
23b00 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74  egDest>=0 then t
23b10 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
23b20 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ays stored in th
23b30 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  at register and 
23b40 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  the.** result is
23b50 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20   not reusable.  
23b60 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65  If regDest<0 the
23b70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23b80 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74  s free to .** st
23b90 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68  ore the value wh
23ba0 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73  ereever it wants
23bb0 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
23bc0 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
23bd0 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72  sion .** is stor
23be0 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ed is returned. 
23bf0 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c   When regDest<0,
23c00 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65   two identical e
23c10 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a  xpressions will.
23c20 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73  ** code to the s
23c30 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  ame register..*/
23c40 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23c50 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
23c60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23c70 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23c80 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
23c90 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
23ca0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
23cb0 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
23cc0 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
23cd0 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20  .  int regDest  
23ce0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
23cf0 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
23d00 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
23d10 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
23d20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
23d30 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
23d40 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
23d50 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28  ConstExpr;.  if(
23d60 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20   regDest<0 && p 
23d70 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
23d80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
23d90 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  em;.    int i;. 
23da0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
23db0 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
23dc0 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
23dd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
23de0 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
23df0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
23e00 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70  re(0,pItem->pExp
23e10 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
23e20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
23e30 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
23e40 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d  ExprReg;.      }
23e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
23e60 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23e70 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
23e80 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
23e90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23ea0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23eb0 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
23ec0 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
23ed0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23ee0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
23ef0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
23f00 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
23f10 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20  = regDest<0;.   
23f20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
23f30 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50  ) regDest = ++pP
23f40 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
23f50 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
23f60 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
23f70 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  t;.  }.  pParse-
23f80 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
23f90 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73  .  return regDes
23fa0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
23fb0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
23fc0 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
23fd0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
23fe0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
23ff0 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
24000 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
24010 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
24020 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
24030 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
24040 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
24050 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
24060 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
24070 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
24080 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
24090 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
240a0 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
240b0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
240c0 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
240d0 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
240e0 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
240f0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
24100 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
24110 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
24120 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
24130 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
24140 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
24150 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
24160 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
24170 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
24180 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
24190 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
241a0 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
241b0 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
241c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
241d0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
241e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
241f0 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
24200 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
24210 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
24220 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
24230 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
24240 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
24250 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
24260 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
24270 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24280 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
24290 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20    ){.    *pReg  
242a0 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  = 0;.    r2 = sq
242b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
242c0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
242d0 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, -1);.  }else{
242e0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
242f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24300 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
24310 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24320 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24330 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
24340 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
24350 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
24360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24370 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24380 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
24390 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
243a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
243b0 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
243c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
243d0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
243e0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
243f0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24400 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24410 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24420 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24430 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24440 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24450 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24460 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24470 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
24480 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24490 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
244a0 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
244b0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
244c0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
244d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
244e0 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
244f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
24500 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
24510 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
24520 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
24530 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
24540 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
24550 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
24560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24570 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24580 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24590 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
245a0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
245b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
245c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
245d0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
245e0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
245f0 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
24600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24610 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
24620 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
24630 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
24640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
24650 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
24660 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
24670 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
24680 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
24690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
246a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
246b0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
246c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
246d0 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
246e0 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
246f0 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
24700 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
24710 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24720 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
24730 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24740 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24750 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
24760 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24770 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
24780 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
24790 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
247a0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
247b0 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
247c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
247d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
247e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
247f0 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
24800 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24810 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
24820 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
24830 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
24840 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
24850 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
24860 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
24870 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
24880 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
24890 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
248a0 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
248b0 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
248c0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
248d0 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
248e0 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
248f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
24900 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
24910 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
24920 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
24930 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
24940 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24950 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
24960 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
24970 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
24980 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
24990 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
249a0 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
249b0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
249c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
249d0 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
249e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
249f0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
24a00 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
24a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24a20 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
24a30 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e  luates the given
24a40 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
24a50 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
24a60 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24a70 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
24a80 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
24a90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24aa0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
24ab0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
24ac0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
24ad0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
24ae0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
24af0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
24b00 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
24b10 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
24b20 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
24b30 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
24b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
24b50 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
24b60 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
24b70 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
24b80 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
24b90 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
24ba0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
24bb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24bc0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
24bd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24be0 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
24bf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24c00 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24c10 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
24c20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24c30 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
24c40 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24c50 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
24c60 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24c70 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
24c80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24c90 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24ca0 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
24cb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24cd0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
24ce0 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
24cf0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
24d00 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f  xpr, iMem);.}../
24d10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24d20 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
24d30 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
24d40 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
24d50 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
24d60 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
24d70 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
24d80 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
24d90 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
24da0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
24db0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
24dc0 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20  evaluated.  The 
24dd0 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
24de0 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20  will.** usually 
24df0 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  be pList->nExpr 
24e00 62 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64  but might be red
24e10 75 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45  uced if SQLITE_E
24e20 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69  CEL_OMITREF.** i
24e30 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  s defined..**.**
24e40 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24e50 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e  _DUP flag preven
24e60 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ts the arguments
24e70 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66   from being.** f
24e80 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  illed using OP_S
24e90 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d  Copy.  OP_Copy m
24ea0 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
24eb0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
24ec0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
24ed0 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77  R argument allow
24ee0 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  s constant argum
24ef0 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61  ents to be.** fa
24f00 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20  ctored out into 
24f10 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
24f20 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ode..**.** The S
24f30 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66  QLITE_ECEL_REF f
24f40 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65  lag means that e
24f50 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
24f60 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45  e list with.** E
24f70 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e  xprList.a[].u.x.
24f80 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61  iOrderByCol>0 ha
24f90 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
24fa0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74  evaluated and st
24fb0 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73  ored.** in regis
24fc0 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20  ters at srcReg, 
24fd0 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65  and so the value
24fe0 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66   can be copied f
24ff0 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66  rom there..** If
25000 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
25010 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74  TREF is also set
25020 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
25030 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65  s with u.x.iOrde
25040 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20  rByCol>0.** are 
25050 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72  simply omitted r
25060 61 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67  ather than being
25070 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63   copied from src
25080 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Reg..*/.int sqli
25090 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
250a0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
250b0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
250c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
250d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
250e0 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
250f0 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
25100 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
25110 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
25120 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
25130 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
25140 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
25150 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
25160 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
25170 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
25180 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
25190 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
251a0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
251b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
251c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
251d0 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
251e0 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
251f0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
25200 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
25210 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
25220 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
25230 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
25240 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
25250 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
25260 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
25270 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
25280 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
25290 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
252a0 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
252b0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
252c0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
252d0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
252e0 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
252f0 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
25300 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
25310 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
25320 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
25330 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
25340 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr;.#ifdef SQLIT
25350 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
25360 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
25370 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65  f( pItem->bSorte
25380 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d  rRef ){.      i-
25390 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  -;.      n--;.  
253a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
253b0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
253c0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
253d0 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65  !=0 && (j = pIte
253e0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
253f0 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ol)>0 ){.      i
25400 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
25410 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29  E_ECEL_OMITREF )
25420 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20  {.        i--;. 
25430 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
25440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25460 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b  p2(v, copyOp, j+
25470 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74  srcReg-1, target
25480 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
25490 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
254a0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
254b0 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20  FACTOR)!=0.     
254c0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
254d0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
254e0 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20  tJoin(pExpr).   
254f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25500 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
25510 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25520 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65  arget+i);.    }e
25530 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
25540 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
25550 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
25560 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25570 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
25580 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
25590 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
255a0 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
255b0 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f   if( copyOp==OP_
255c0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
255d0 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62   (pOp=sqlite3Vdb
255e0 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e  eGetOp(v, -1))->
255f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a  opcode==OP_Copy.
25600 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
25610 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69  >p1+pOp->p3+1==i
25620 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
25630 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
25640 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20  +1==target+i.   
25650 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25660 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
25670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25690 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
256a0 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
256b0 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +i);.        }. 
256c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
256d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
256e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
256f0 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
25700 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
25710 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
25720 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
25730 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
25740 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
25750 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
25760 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
25770 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
25780 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
25790 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
257a0 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e  n.** elimination
257b0 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   of x..**.** The
257c0 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74   xJumpIf paramet
257d0 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65  er determines de
257e0 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
257f0 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  NULL:           
25800 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
25810 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
25820 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a   in reg[dest].**
25830 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25840 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70  fTrue:      Jump
25850 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65   to dest if true
25860 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78  .**    sqlite3Ex
25870 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a  prIfFalse:     J
25880 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66  ump to dest if f
25890 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  alse.**.** The j
258a0 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65  umpIfNull parame
258b0 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
258c0 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c  f xJumpIf is NUL
258d0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
258e0 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
258f0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
25900 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
25910 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
25920 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
25930 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
25940 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
25950 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
25960 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
25970 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
25980 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f  stination or sto
25990 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f  rage location */
259a0 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29  .  void (*xJump)
259b0 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
259c0 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f  t,int), /* Actio
259d0 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69  n to take */.  i
259e0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
259f0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
25a00 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
25a10 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
25a20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
25a30 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
25a40 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
25a50 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
25a60 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
25a70 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
25a80 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
25a90 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
25aa0 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
25ab0 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
25ac0 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
25ad0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
25ae0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
25af0 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
25b00 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
25b10 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
25b20 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
25b30 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
25b40 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
25b50 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
25b60 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
25b70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25b80 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
25b90 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25ba0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25bb0 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 4e 6f  ect) );.  exprNo
25bc0 64 65 43 6f 70 79 28 26 65 78 70 72 58 2c 20 70  deCopy(&exprX, p
25bd0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
25be0 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
25bf0 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
25c00 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
25c10 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
25c20 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
25c30 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
25c40 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
25c50 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
25c60 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
25c70 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
25c80 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
25c90 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
25ca0 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
25cb0 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
25cc0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
25cd0 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
25ce0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
25cf0 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
25d00 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
25d10 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
25d20 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
25d30 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
25d40 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20  f( xJump ){.    
25d50 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65  xJump(pParse, &e
25d60 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
25d70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
25d80 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  se{.    /* Mark 
25d90 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
25da0 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65  s being from the
25db0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
25dc0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20  use of a join.  
25dd0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
25de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25df0 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65  Target() routine
25e00 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
25e10 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a  t to move.    **
25e20 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72   it into the Par
25e30 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69  se.pConstExpr li
25e40 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75  st.  We should u
25e50 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72  se a new bit for
25e60 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f   this,.    ** fo
25e70 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77  r clarity, but w
25e80 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74  e are out of bit
25e90 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c  s in the Expr.fl
25ea0 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a  ags field so we.
25eb0 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72      ** have to r
25ec0 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d  euse the EP_From
25ed0 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65  Join bit.  Bumme
25ee0 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e  r. */.    exprX.
25ef0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d  flags |= EP_From
25f00 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  Join;.    sqlite
25f10 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
25f20 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
25f30 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73  , dest);.  }.  s
25f40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25f50 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
25f60 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
25f70 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
25f80 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
25f90 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25fa0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
25fb0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
25fc0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
25fd0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
25fe0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25ff0 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26000 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26010 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26020 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26030 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26040 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26050 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
26060 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26070 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26080 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26090 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
260a0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
260b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
260c0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
260d0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
260e0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
260f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26100 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26120 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
26130 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26140 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26150 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26160 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26170 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
26180 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26190 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
261a0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
261b0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
261c0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
261d0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
261e0 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d  e( xJump==0 );.}
261f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26200 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
26210 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
26220 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
26230 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
26240 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
26250 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26260 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
26270 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
26280 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
26290 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
262a0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
262b0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
262c0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
262d0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
262e0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
262f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
26300 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
26310 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
26320 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
26330 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
26340 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
26350 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
26360 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
26370 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
26380 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
26390 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
263a0 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
263b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
263c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
263d0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
263e0 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
263f0 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
26400 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
26410 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
26420 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
26430 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
26440 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
26450 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
26460 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
26470 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
26480 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
26490 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
264a0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
264b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
264c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
264d0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
264e0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
264f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
26500 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
26510 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
26520 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26530 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
26540 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
26550 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
26560 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
26570 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
26580 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
26590 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
265a0 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
265b0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
265c0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
265d0 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
265e0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
265f0 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
26600 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
26610 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
26620 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
26630 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
26640 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
26650 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
26660 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
26670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26680 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
266a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
266b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
266c0 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
266d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
266e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
266f0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
26700 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26710 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26730 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
26740 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
26750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26760 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26780 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26790 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
267a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
267b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
267c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
267d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
267e0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
267f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
26800 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26810 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26820 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26830 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
26840 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26850 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26860 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26870 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26880 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
26890 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
268a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
268b0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
268c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
268d0 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e  ot;      /* IS N
268e0 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  OT TRUE or IS NO
268f0 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
26900 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
26910 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
26920 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
26930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26940 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26950 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78       isNot = pEx
26960 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f  pr->op2==TK_ISNO
26970 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  T;.      isTrue 
26980 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
26990 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
269a0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
269b0 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
269c0 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
269d0 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
269e0 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
269f0 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
26a00 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
26a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26a20 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26a30 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
26a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a50 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26a60 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26a70 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26a90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26aa0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26ab0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
26ae0 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
26af0 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
26b00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26b10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26b20 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
26b30 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
26b40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
26b50 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
26b60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
26b70 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
26b80 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
26b90 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
26ba0 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
26bb0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
26bc0 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
26bd0 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
26be0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
26bf0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
26c00 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
26c10 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
26c20 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
26c30 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
26c40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
26c50 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
26c60 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
26c70 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
26c80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26c90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
26ca0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26cb0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26cc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26cd0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26ce0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
26cf0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26d00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26d10 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
26d20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
26d30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26d40 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
26d50 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
26d60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
26d70 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26d80 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
26d90 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
26da0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26db0 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
26dc0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
26dd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26de0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
26df0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
26e00 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26e10 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
26e20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26e30 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
26e40 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
26e50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26e60 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
26e70 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
26e80 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
26e90 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
26ea0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26eb0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
26ec0 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
26ed0 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
26ee0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
26ef0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26f00 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
26f10 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26f20 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26f30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26f40 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
26f50 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
26f60 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26f70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
26f80 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
26f90 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
26fa0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26fb0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
26fc0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
26fd0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
26fe0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26ff0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27000 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27010 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27020 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27030 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27040 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27050 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
27060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27070 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
27080 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
27090 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
270a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
270b0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
270c0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
270d0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
270e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
270f0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
27100 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
27110 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
27120 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
27130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27140 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27150 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
27160 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
27170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27180 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
27190 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
271a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
271b0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
271c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
271d0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
271e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
271f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27210 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
27220 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
27230 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27240 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27250 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
27260 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27270 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
27280 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
27290 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
272a0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
272b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
272c0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
272d0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
272e0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
272f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27300 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
27310 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
27320 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
27330 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
27340 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
27350 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
27360 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27370 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
27380 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27390 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
273a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
273b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
273c0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
273d0 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
273e0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
273f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
27400 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
27410 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
27420 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
27430 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27440 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
27450 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
27460 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
27470 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
27480 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
27490 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
274a0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
274b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
274c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
274d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
274e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
274f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
27500 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
27510 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
27520 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
27530 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
27540 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27550 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
27560 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27570 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
27580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27590 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
275a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
275b0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
275c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
275d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
275e0 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
275f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27600 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
27610 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
27620 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
27630 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
27640 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
27650 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27660 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
27670 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
27680 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
27690 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
276a0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
276b0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
276c0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
276d0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
276e0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
276f0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
27700 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
27710 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27720 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
27730 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
27740 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
27750 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27760 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
27770 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27780 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27790 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
277a0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
277b0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
277c0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
277d0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
277e0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
277f0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27800 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27810 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27820 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27830 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27840 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
27850 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
27860 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
27870 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
27880 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
27890 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
278a0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
278b0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
278c0 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
278d0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
278e0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
278f0 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
27900 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
27910 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
27920 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
27930 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
27940 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
27950 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
27960 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
27970 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
27980 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
27990 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
279a0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
279b0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
279c0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
279d0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
279e0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
279f0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
27a00 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
27a10 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
27a20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
27a30 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
27a40 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
27a50 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
27a60 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
27a70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
27a80 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
27a90 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27aa0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27ab0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27ac0 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27ad0 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
27ae0 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
27af0 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
27b00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
27b10 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
27b20 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
27b30 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
27b40 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
27b50 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
27b60 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
27b70 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
27b80 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
27b90 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27ba0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27bb0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27bc0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27bd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
27be0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
27bf0 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
27c00 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27c10 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
27c20 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
27c30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27c40 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
27c50 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
27c60 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27c70 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
27c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27c90 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
27ca0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
27cb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27cc0 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
27cd0 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
27ce0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27cf0 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
27d00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27d10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
27d20 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
27d30 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
27d40 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
27d50 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
27d60 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27d70 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27d80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27d90 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27da0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27db0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27dc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27dd0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27de0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
27df0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27e10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
27e20 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
27e30 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
27e40 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
27e50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27e60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27e80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
27e90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27ea0 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
27eb0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27ec0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
27ed0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27ee0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
27ef0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
27f00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27f10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27f20 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
27f30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27f40 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
27f50 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27f60 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27f70 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27f80 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27f90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27fa0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27fb0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27fd0 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
27fe0 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
27ff0 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f  /* IS NOT TRUE o
28000 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  r IS NOT FALSE *
28010 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
28020 75 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ue;  /* IS TRUE 
28030 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
28040 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
28050 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28060 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
28070 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
28080 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
28090 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
280a0 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
280b0 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
280c0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
280d0 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
280e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
280f0 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
28100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
28110 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
28120 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55         /* IS TRU
28130 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c  E and IS NOT FAL
28140 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  SE */.        sq
28150 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
28160 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28170 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
281a0 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
281b0 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d  FNULL);..      }
281c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
281d0 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53   IS FALSE and IS
281e0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
281f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28200 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28210 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28220 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
28240 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
28250 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
28260 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
28270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28280 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
28290 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
282a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
282b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
282c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
282d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
282e0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
282f0 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
28300 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
28310 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _EQ;.      jumpI
28320 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
28330 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
28340 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
28350 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
28360 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
28370 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
28380 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
28390 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
283a0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
283b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
283c0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
283d0 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
283e0 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
283f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28400 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28410 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
28420 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28430 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28440 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
28450 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
28460 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
28470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28480 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
28490 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
284a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
284b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
284c0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
284f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28500 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
28510 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
28520 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
28530 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28540 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
28550 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
28560 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
28570 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
28580 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28590 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
285a0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
285b0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
285c0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
285d0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
285e0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
285f0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
28600 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28610 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
28620 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
28630 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
28640 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
28650 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28660 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
28670 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
28680 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
28690 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
286a0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
286b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
286c0 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
286d0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
286e0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
286f0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
28700 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28710 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
28720 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28730 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
28740 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
28750 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
28760 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28770 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
28780 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
28790 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
287a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
287b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
287c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
287d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
287e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
287f0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
28800 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
28810 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
28820 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28830 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28840 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
28850 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
28860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28870 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
28880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28890 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
288a0 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
288b0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
288c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
288d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
288e0 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
288f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
28900 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
28910 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
28920 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28940 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
28950 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
28960 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28970 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
28980 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
28990 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
289a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
289b0 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  lse, jumpIfNull)
289c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
289d0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
289e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
289f0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
28a00 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
28a10 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
28a20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28a30 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28a40 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
28a50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28a60 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
28a70 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
28a80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
28a90 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
28aa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28ab0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28ac0 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
28ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28ae0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28af0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
28b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28b10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
28b20 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
28b30 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
28b40 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
28b50 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
28b60 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28b80 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28b90 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
28ba0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
28bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28bc0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
28bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
28be0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28bf0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
28c00 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
28c10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28c20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
28c30 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
28c40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
28c50 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28c60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
28c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28c80 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28ca0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28cc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
28cd0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28ce0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
28cf0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
28d00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
28d10 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
28d20 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
28d30 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
28d40 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
28d50 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
28d60 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
28d70 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
28d80 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
28d90 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
28da0 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
28db0 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
28dc0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
28dd0 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
28de0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
28df0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
28e00 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
28e10 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28e20 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
28e30 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
28e40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
28e50 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
28e60 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
28e70 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
28e80 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
28e90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28ea0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
28eb0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28ec0 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
28ed0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28ee0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
28ef0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
28f00 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  py);.}../*.** Ex
28f10 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73  pression pVar is
28f20 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28f30 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  e an SQL variabl
28f40 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20  e. pExpr may be 
28f50 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65  any.** type of e
28f60 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
28f70 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
28f80 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
28f90 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  - an integer, re
28fa0 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62  al, string, blob
28fb0 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  .** or NULL valu
28fc0 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42  e - then the VDB
28fd0 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  E currently bein
28fe0 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f  g prepared is co
28ff0 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72  nfigured.** to r
29000 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74  e-prepare each t
29010 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ime a new value 
29020 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  is bound to vari
29030 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a  able pVar..**.**
29040 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
29050 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
29060 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e  ple SQL value an
29070 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  d the value is t
29080 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68  he.** same as th
29090 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75  at currently bou
290a0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
290b0 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  Var, non-zero is
290c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
290d0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
290e0 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74  values are not t
290f0 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45  he same or if pE
29100 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  xpr is not a sim
29110 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65  ple.** SQL value
29120 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
29130 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29140 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  t exprCompareVar
29150 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  iable(Parse *pPa
29160 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c  rse, Expr *pVar,
29170 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
29180 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
29190 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69  int iVar;.  sqli
291a0 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a  te3_value *pL, *
291b0 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c  pR = 0;.  .  sql
291c0 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
291d0 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
291e0 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
291f0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
29200 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70  B, &pR);.  if( p
29210 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20  R ){.    iVar = 
29220 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pVar->iColumn;. 
29230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
29240 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
29250 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
29260 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56     pL = sqlite3V
29270 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
29280 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
29290 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54  are, iVar, SQLIT
292a0 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20  E_AFF_BLOB);.   
292b0 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20   if( pL ){.     
292c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
292d0 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c  ue_type(pL)==SQL
292e0 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
292f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
29300 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d  e_text(pL); /* M
29310 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63  ake sure the enc
29320 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a  oding is UTF-8 *
29330 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29340 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65  res =  0==sqlite
29350 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20  3MemCompare(pL, 
29360 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pR, 0);.    }.  
29370 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29380 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69  ee(pR);.    sqli
29390 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29  te3ValueFree(pL)
293a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
293b0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  res;.}../*.** Do
293c0 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
293d0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
293e0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
293f0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
29400 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
29410 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
29420 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
29430 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
29440 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
29450 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
29460 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
29470 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
29480 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
29490 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
294a0 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
294b0 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
294c0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
294d0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
294e0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
294f0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
29500 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
29510 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
29520 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
29530 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
29540 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
29550 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
29560 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
29570 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
29580 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
29590 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
295a0 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
295b0 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
295c0 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
295d0 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
295e0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
295f0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
29600 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
29610 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
29620 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
29630 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
29640 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
29650 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
29660 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
29670 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
29680 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
29690 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
296a0 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
296b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
296c0 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
296d0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
296e0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
296f0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
29700 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
29710 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
29720 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
29730 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
29740 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
29750 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
29760 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
29770 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
29780 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
29790 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
297a0 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
297b0 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
297c0 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
297d0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
297e0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
297f0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
29800 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
29810 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
29820 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
29830 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   malfunction..**
29840 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
29850 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54   not NULL then T
29860 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73  K_VARIABLE terms
29870 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64   in pA with bind
29880 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73  ings in.** pPars
29890 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61  e->pReprepare ca
298a0 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  n be matched aga
298b0 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e  inst literals in
298c0 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50   pB.  The .** pP
298d0 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
298e0 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20  mask bitmask is 
298f0 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68  updated for each
29900 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
29910 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72  nced..** If pPar
29920 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20  se is NULL (the 
29930 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65  normal case) the
29940 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  n any TK_VARIABL
29950 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72  E term in .** Ar
29960 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68  gument pParse sh
29970 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
29980 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
29990 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20  not NULL and pA 
299a0 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20  or.** pB causes 
299b0 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  a return value o
299c0 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 2..*/.int sqli
299d0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50  te3ExprCompare(P
299e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
299f0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
29a00 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
29a10 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
29a20 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
29a30 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
29a40 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
29a50 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  : 2;.  }.  if( p
29a60 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d  Parse && pA->op=
29a70 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20  =TK_VARIABLE && 
29a80 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
29a90 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20  ble(pParse, pA, 
29aa0 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pB) ){.    retur
29ab0 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  n 0;.  }.  combi
29ac0 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
29ad0 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
29ae0 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
29af0 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
29b00 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
29b10 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
29b20 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
29b30 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
29b40 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
29b50 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
29b60 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
29b70 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
29b80 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
29b90 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  p || pA->op==TK_
29ba0 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69 66 28  RAISE ){.    if(
29bb0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
29bc0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
29bd0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
29be0 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69  , pA->pLeft,pB,i
29bf0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
29c00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
29c10 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
29c20 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
29c30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29c40 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e  (pParse, pA,pB->
29c50 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b  pLeft,iTab)<2 ){
29c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
29c70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
29c80 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
29c90 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
29ca0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
29cb0 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
29cc0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
29cd0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
29ce0 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
29cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
29d00 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
29d10 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
29d20 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 23  =0 ) return 2;.#
29d30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29d40 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
29d50 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
29d60 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 73 73  tion for the ass
29d70 65 72 74 28 29 3a 0a 20 20 20 20 20 20 2a 2a 20  ert():.      ** 
29d80 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
29d90 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f   have p->op==TK_
29da0 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61 67 67  FUNCTION but agg
29db0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
29dc0 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 70  .      ** have p
29dd0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
29de0 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20 63  CTION.  So any c
29df0 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
29e00 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 20  n an aggregate. 
29e10 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
29e20 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75   and a window fu
29e30 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61  nction should ha
29e40 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65  ve failed before
29e50 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 20 20   reaching.      
29e60 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20  ** this point.  
29e70 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  And, it is not p
29e80 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
29e90 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
29ea0 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 61  n and.      ** a
29eb0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
29ec0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
29ed0 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ame and number o
29ee0 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 6f  f arguments.  So
29ef0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 77 65 20  .      ** if we 
29f00 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
29f10 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64 20 42  , either A and B
29f20 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66 75 6e   both window fun
29f30 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20 20 20  ctions or.      
29f40 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20 61  ** neither are a
29f50 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
29f60 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
29f70 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
29f80 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e  rty(pA,EP_WinFun
29f90 63 29 3d 3d 45 78 70 72 48 61 73 50 72 6f 70 65  c)==ExprHasPrope
29fa0 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e  rty(pB,EP_WinFun
29fb0 63 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  c) );.      if( 
29fc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29fd0 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  pA,EP_WinFunc) )
29fe0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
29ff0 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61  lite3WindowCompa
2a000 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e 79 2e  re(pParse,pA->y.
2a010 70 57 69 6e 2c 70 42 2d 3e 79 2e 70 57 69 6e 29  pWin,pB->y.pWin)
2a020 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
2a030 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2a040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d     }else if( pA-
2a050 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a  >op==TK_NULL ){.
2a060 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2a070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
2a080 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a090 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
2a0a0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41  lite3_stricmp(pA
2a0b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
2a0c0 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
2a0d0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
2a0e0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 42 2d  e if( ALWAYS(pB-
2a0f0 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26  >u.zToken!=0) &&
2a100 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
2a110 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
2a120 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
2a130 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
2a140 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
2a150 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a160 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
2a170 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
2a180 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
2a190 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
2a1a0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
2a1b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d  0 ){.    if( com
2a1c0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2a1d0 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75  xIsSelect ) retu
2a1e0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 28 63  rn 2;.    if( (c
2a1f0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2a200 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20  P_FixedCol)==0. 
2a210 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
2a220 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a230 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  , pA->pLeft, pB-
2a240 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
2a250 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2a260 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2a270 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a280 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
2a290 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
2a2a0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
2a2b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2a2c0 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
2a2d0 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
2a2e0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
2a2f0 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  ;.    if( pA->op
2a300 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20  !=TK_STRING.    
2a310 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54   && pA->op!=TK_T
2a320 52 55 45 46 41 4c 53 45 0a 20 20 20 20 20 26 26  RUEFALSE.     &&
2a330 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20   (combinedFlags 
2a340 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
2a350 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
2a360 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
2a370 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
2a380 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
2a390 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
2a3a0 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
2a3b0 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
2a3c0 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
2a3d0 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
2a3e0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2a3f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2a400 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
2a410 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2a420 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
2a430 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
2a440 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
2a450 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
2a460 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
2a470 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
2a480 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
2a490 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
2a4a0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
2a4b0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
2a4c0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
2a4d0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
2a4e0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
2a4f0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
2a500 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
2a510 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
2a520 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
2a530 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
2a540 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
2a550 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
2a560 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
2a570 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
2a580 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
2a590 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
2a5a0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2a5b0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2a5c0 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
2a5d0 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
2a5e0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
2a5f0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
2a600 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
2a610 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
2a620 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
2a630 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
2a640 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
2a650 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
2a660 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
2a670 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
2a680 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
2a690 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
2a6a0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2a6b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2a6c0 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
2a6d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2a6e0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2a6f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2a700 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
2a710 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
2a720 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
2a730 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
2a740 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2a750 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
2a760 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
2a770 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
2a780 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2a790 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
2a7a0 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
2a7b0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
2a7c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2a7d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2a7e0 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
2a7f0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
2a800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2a810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
2a820 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a830 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c  re() except COLL
2a840 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74  ATE operators at
2a850 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a   the top-level.*
2a860 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  * are ignored..*
2a870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a880 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70  rCompareSkip(Exp
2a890 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
2a8a0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65   int iTab){.  re
2a8b0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2a8c0 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20  Compare(0,.     
2a8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a8e0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2a8f0 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
2a900 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2a910 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20  Collate(pB),.   
2a920 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b            iTab);
2a930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a940 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
2a950 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
2a960 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
2a970 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
2a980 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
2a990 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
2a9a0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
2a9b0 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
2a9c0 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
2a9d0 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
2a9e0 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
2a9f0 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2aa00 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2aa10 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2aa20 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
2aa30 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2aa40 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
2aa50 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
2aa60 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
2aa70 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
2aa80 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2aa90 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
2aaa0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2aab0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2aac0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2aad0 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
2aae0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2aaf0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2ab00 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2ab10 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
2ab20 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2ab30 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2ab40 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
2ab50 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2ab60 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
2ab70 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
2ab80 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
2ab90 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
2aba0 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
2abb0 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
2abc0 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
2abd0 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
2abe0 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
2abf0 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iTab..**.** If 
2ac00 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2ac10 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  LL, then the val
2ac20 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72  ues of bound var
2ac30 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72  iables in pE1 ar
2ac40 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61  e .** compared a
2ac50 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76  gainst literal v
2ac60 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64  alues in pE2 and
2ac70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
2ac80 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f  expmask is.** mo
2ac90 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64  dified to record
2aca0 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72   which bound var
2acb0 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72  iables are refer
2acc0 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73  enced.  If pPars
2acd0 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74  e .** is NULL, t
2ace0 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62  hen false will b
2acf0 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45  e returned if pE
2ad00 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62  1 contains any b
2ad10 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a  ound variables..
2ad20 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
2ad30 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
2ad40 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
2ad50 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
2ad60 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2ad70 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
2ad80 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
2ad90 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
2ada0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
2adb0 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
2adc0 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
2add0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2ade0 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
2adf0 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
2ae00 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2ae10 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70  iesExpr(Parse *p
2ae20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31  Parse, Expr *pE1
2ae30 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
2ae40 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
2ae50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ae60 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2ae70 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
2ae80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2ae90 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2aea0 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
2aeb0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2aec0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2aed0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2aee0 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
2aef0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
2af00 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2af10 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  , pE1, pE2->pRig
2af20 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
2af30 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2af40 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
2af50 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20  ==TK_NOTNULL && 
2af60 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  pE1->op!=TK_ISNU
2af70 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2af80 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72  K_IS ){.    Expr
2af90 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78   *pX = sqlite3Ex
2afa0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
2afb0 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74  1->pLeft);.    t
2afc0 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45 31  estcase( pX!=pE1
2afd0 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69  ->pLeft );.    i
2afe0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2aff0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 58  mpare(pParse, pX
2b000 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2b010 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
2b020 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2b030 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
2b040 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f 64   is the Expr nod
2b050 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73  e callback for s
2b060 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2b070 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a  sNotNullRow()..*
2b080 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2b090 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72 65  ion node require
2b0a0 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
2b0b0 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75   at pWalker->iCu
2b0c0 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20 6f 72  r.** have one or
2b0d0 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 63   more non-NULL c
2b0e0 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20  olumn, then set 
2b0f0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
2b100 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  o 1 and abort..*
2b110 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b120 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f 70  e controls an op
2b130 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 61 6c  timization.  Fal
2b140 73 65 20 70 6f 73 69 74 69 76 65 73 20 28 73 65  se positives (se
2b150 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65 72  tting.** pWalker
2b160 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77 68 65  ->eCode to 1 whe
2b170 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  n it should not 
2b180 62 65 29 20 61 72 65 20 64 65 61 64 6c 79 2c 20  be) are deadly, 
2b190 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61 74 69  but false-negati
2b1a0 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20 73 65  ves.** (never se
2b1b0 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d 3e 65  tting pWalker->e
2b1c0 43 6f 64 65 29 20 69 73 20 61 20 68 61 72 6d 6c  Code) is a harml
2b1d0 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74 69 6d  ess missed optim
2b1e0 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ization..*/.stat
2b1f0 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f  ic int impliesNo
2b200 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20  tNullRow(Walker 
2b210 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2b220 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74 63 61  pExpr){.  testca
2b230 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b240 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2b250 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b260 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2b270 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
2b280 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2b290 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
2b2a0 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  in) ) return WRC
2b2b0 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74 63 68  _Prune;.  switch
2b2c0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2b2d0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
2b2e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
2b2f0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
2b300 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
2b310 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20  TK_NOTNULL:.    
2b320 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2b330 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2b340 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2b350 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2b360 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2b370 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2b380 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b390 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2b3a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b3b0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2b3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b3d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2b3e0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2b3f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b400 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
2b410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b420 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2b430 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
2b440 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b450 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
2b460 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b470 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20  op==TK_CASE );. 
2b480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b490 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2b4a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b4b0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b4c0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
2b4d0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2b4e0 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  une;.    case TK
2b4f0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69  _COLUMN:.      i
2b500 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  f( pWalker->u.iC
2b510 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  ur==pExpr->iTabl
2b520 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61  e ){.        pWa
2b530 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2b540 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b550 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2b560 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2b570 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20  WRC_Prune;..    
2b580 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
2b590 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
2b5a0 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   use constraints
2b5b0 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53   like x=NULL.  S
2b5c0 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20  o.    ** a term 
2b5d0 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20  of the form x=y 
2b5e0 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74  does not prove t
2b5f0 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c  hat y is not nul
2b600 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73  l if x.    ** is
2b610 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   the column of a
2b620 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2b630 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  /.    case TK_EQ
2b640 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
2b650 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  :.    case TK_LT
2b660 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
2b670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
2b680 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
2b690 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
2b6a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b6b0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
2b6c0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b6d0 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
2b6e0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b6f0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20  >op==TK_LT );.  
2b700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b710 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29  xpr->op==TK_LE )
2b720 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b730 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b740 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
2b750 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b760 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
2b770 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  if( (pExpr->pLef
2b780 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2b790 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45   && IsVirtual(pE
2b7a0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54  xpr->pLeft->y.pT
2b7b0 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ab)).       || (
2b7c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f  pExpr->pRight->o
2b7d0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
2b7e0 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d  IsVirtual(pExpr-
2b7f0 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61 62 29  >pRight->y.pTab)
2b800 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2b810 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2b820 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
2b830 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
2b840 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2b850 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ue;.  }.}../*.**
2b860 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
2b870 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65  n-zero) if expre
2b880 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79  ssion p can only
2b890 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20 6c   be true if at l
2b8a0 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75  east.** one colu
2b8b0 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62  mn of table iTab
2b8c0 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49   is non-null.  I
2b8d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
2b8e0 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
2b8f0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2b900 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c  ll always be NUL
2b910 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76  L or false if ev
2b920 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2b930 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  ab.** is NULL..*
2b940 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74  *.** False negat
2b950 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74 61  ives are accepta
2b960 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
2b970 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74  ords, it is ok t
2b980 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  o return.** zero
2b990 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73 73   even if express
2b9a0 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72  ion p will never
2b9b0 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65 72   be true of ever
2b9c0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2b9d0 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20  .** is NULL.  A 
2b9e0 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69  false negative i
2b9f0 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65  s merely a misse
2ba00 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  d optimization o
2ba10 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a  pportunity..**.*
2ba20 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65  * False positive
2ba30 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
2ba40 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66  d, however.  A f
2ba50 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61  alse positive ma
2ba60 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
2ba70 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
2ba80 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  er..**.** Terms 
2ba90 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d 61  of p that are ma
2baa0 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f  rked with EP_Fro
2bab0 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65  mJoin (and hence
2bac0 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a   that come from.
2bad0 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
2bae0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45  NG clauses of LE
2baf0 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78  FT JOINS) are ex
2bb00 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
2bb10 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20  analysis..**.** 
2bb20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2bb30 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
2bb40 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
2bb50 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2bb60 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
2bb70 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61  y JOIN.  The p a
2bb80 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57  rgument is the W
2bb90 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66  HERE clause.  If
2bba0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2bbb0 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74 68  ause requires th
2bbc0 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f  at some column o
2bbd0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2bbe0 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  e of the LEFT JO
2bbf0 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c  IN.** be non-NUL
2bc00 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54  L, then the LEFT
2bc10 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66   JOIN can be saf
2bc20 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  ely converted in
2bc30 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  to an.** ordinar
2bc40 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  y join..*/.int s
2bc50 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2bc60 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72  sNonNullRow(Expr
2bc70 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a   *p, int iTab){.
2bc80 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 70 20    Walker w;.  p 
2bc90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2bca0 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 77  pCollate(p);.  w
2bcb0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
2bcc0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54  f( p->op==TK_NOT
2bcd0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 20  NULL ){.      p 
2bce0 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
2bcf0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
2bd00 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
2bd10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2bd20 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2bd30 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  w(p->pLeft, iTab
2bd40 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2bd50 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
2bd60 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2bd70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2bd80 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72 43 61  .  }.  w.xExprCa
2bd90 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73  llback = implies
2bda0 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e  NotNullRow;.  w.
2bdb0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2bdc0 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  = 0;.  w.xSelect
2bdd0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2bde0 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20   w.eCode = 0;.  
2bdf0 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b  w.u.iCur = iTab;
2be00 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2be10 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
2be20 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
2be30 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2be40 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2be50 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2be60 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2be70 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
2be80 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
2be90 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2bea0 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
2beb0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
2bec0 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
2bed0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
2bee0 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
2bef0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2bf00 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
2bf10 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
2bf20 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
2bf30 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
2bf40 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
2bf50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
2bf60 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
2bf70 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
2bf80 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
2bf90 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2bfa0 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
2bfb0 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
2bfc0 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
2bfd0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2bfe0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
2bff0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
2c000 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
2c010 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
2c020 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
2c030 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2c040 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
2c050 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2c060 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
2c070 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
2c080 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
2c090 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2c0a0 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
2c0b0 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
2c0c0 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
2c0d0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2c0e0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2c0f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
2c100 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
2c110 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
2c120 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
2c130 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
2c140 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
2c150 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2c160 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
2c170 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
2c180 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2c190 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
2c1a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
2c1b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2c1c0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2c1d0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
2c1e0 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
2c1f0 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
2c200 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
2c210 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
2c220 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
2c230 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2c240 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
2c250 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2c260 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
2c270 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2c280 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
2c290 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
2c2a0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
2c2b0 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
2c2c0 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
2c2d0 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
2c2e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
2c2f0 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
2c300 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
2c310 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
2c320 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
2c330 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
2c340 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
2c350 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2c360 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
2c370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2c380 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
2c390 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
2c3a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2c3b0 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2c3c0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
2c3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c3e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2c3f0 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
2c400 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
2c410 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2c420 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2c430 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
2c440 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
2c450 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
2c460 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
2c470 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
2c480 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2c490 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
2c4a0 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
2c4b0 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
2c4c0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c4d0 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
2c4e0 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
2c4f0 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
2c500 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2c510 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
2c520 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
2c530 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2c540 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2c550 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2c560 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2c570 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
2c580 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
2c590 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
2c5a0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
2c5b0 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
2c5c0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
2c5d0 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
2c5e0 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
2c5f0 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
2c600 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
2c610 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2c620 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2c630 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
2c640 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
2c650 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
2c660 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
2c670 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
2c680 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2c690 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2c6a0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
2c6b0 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
2c6c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2c6d0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2c6e0 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
2c6f0 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
2c700 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
2c710 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2c720 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
2c730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2c740 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
2c750 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2c760 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2c770 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
2c780 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
2c790 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
2c7a0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2c7b0 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
2c7c0 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
2c7d0 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
2c7e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2c7f0 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
2c800 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
2c810 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
2c820 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
2c830 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
2c840 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
2c850 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2c860 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
2c870 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
2c880 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
2c890 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
2c8a0 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
2c8b0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2c8c0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
2c8d0 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
2c8e0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2c8f0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2c900 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
2c910 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
2c920 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
2c930 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2c940 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2c950 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
2c960 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
2c970 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c980 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
2c990 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2c9a0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
2c9b0 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
2c9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c9d0 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
2c9e0 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
2c9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
2ca00 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
2ca10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2ca20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2ca30 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
2ca40 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
2ca50 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
2ca60 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
2ca70 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
2ca80 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
2ca90 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
2caa0 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
2cab0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
2cac0 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
2cad0 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
2cae0 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
2caf0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2cb00 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
2cb10 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
2cb20 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
2cb30 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
2cb40 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
2cb50 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
2cb60 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
2cb70 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
2cb80 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
2cb90 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2cba0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
2cbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2cbc0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2cbd0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45  NCTION );.  w.xE
2cbe0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2cbf0 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
2cc00 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2cc10 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  = 0;.  w.u.pSrcC
2cc20 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
2cc30 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
2cc40 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
2cc50 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
2cc60 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
2cc70 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
2cc80 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
2cc90 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
2cca0 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
2ccb0 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
2ccc0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2ccd0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2cce0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
2ccf0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2cd00 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2cd10 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2cd20 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2cd30 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2cd40 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2cd50 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
2cd60 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
2cd70 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2cd80 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2cd90 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
2cda0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2cdb0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
2cdc0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
2cdd0 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
2cde0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
2cdf0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2ce00 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
2ce10 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2ce20 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2ce30 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2ce40 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
2ce50 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
2ce60 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2ce70 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2ce80 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2ce90 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2cea0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2ceb0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2cec0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
2ced0 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
2cee0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2cef0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2cf00 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
2cf10 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
2cf20 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
2cf30 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
2cf40 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
2cf50 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
2cf60 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2cf70 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
2cf80 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2cf90 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2cfa0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
2cfb0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
2cfc0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
2cfd0 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
2cfe0 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
2cff0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2d000 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
2d010 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2d020 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
2d030 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2d040 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2d050 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2d060 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
2d070 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2d080 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
2d090 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
2d0a0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
2d0b0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
2d0c0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
2d0d0 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
2d0e0 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
2d0f0 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
2d100 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
2d110 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e   pNC->uNC.pAggIn
2d120 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  fo;..  assert( p
2d130 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2d140 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73  _UAggInfo );.  s
2d150 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2d160 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2d170 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
2d180 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2d190 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2d1a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2d1b0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
2d1c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2d1d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2d1e0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
2d1f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2d200 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
2d210 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
2d220 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2d230 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2d240 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2d250 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
2d260 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
2d270 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
2d280 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d290 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
2d2a0 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
2d2b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
2d2c0 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2d2d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d2e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2d2f0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
2d300 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d310 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2d320 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2d330 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2d340 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
2d350 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2d360 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2d370 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
2d380 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2d390 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2d3a0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
2d3b0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
2d3c0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2d3d0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
2d3e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2d3f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2d400 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
2d410 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2d420 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
2d430 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
2d440 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
2d450 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
2d460 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2d470 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
2d480 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2d490 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d4a0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
2d4b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2d4c0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
2d4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2d4e0 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
2d4f0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
2d500 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
2d510 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2d520 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2d530 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d550 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
2d560 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2d580 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2d590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d5a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2d5b0 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
2d5c0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
2d5d0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
2d5e0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2d5f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2d600 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
2d610 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d620 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
2d630 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
2d640 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2d650 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
2d660 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
2d670 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2d680 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
2d690 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
2d6a0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2d6b0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
2d6c0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
2d6d0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
2d6e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2d6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d700 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2d710 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2d720 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
2d730 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2d740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2d750 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2d760 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2d770 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2d790 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
2d7a0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2d7b0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2d7c0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2d7d0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
2d7e0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
2d7f0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
2d800 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2d810 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2d820 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
2d830 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2d840 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2d850 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2d860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d870 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2d880 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
2d890 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2d8a0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d8c0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
2d8d0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8f0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2d900 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2d920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2d970 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d980 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2d990 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2d9a0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
2d9b0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
2d9c0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
2d9d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d9e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d9f0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2da00 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
2da10 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
2da20 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
2da30 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2da40 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
2da50 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
2da60 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
2da70 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
2da80 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
2da90 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
2daa0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
2dab0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
2dac0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2dad0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
2dae0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
2daf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2db00 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2db10 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2db20 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2db30 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2db40 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2db50 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2db60 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2db70 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
2db80 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2db90 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
2dba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2dbb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
2dbc0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
2dbd0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
2dbe0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
2dbf0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
2dc00 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
2dc10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2dc20 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2dc30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2dc40 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2dc50 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
2dc60 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2dc70 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
2dc80 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
2dc90 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
2dca0 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
2dcb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2dcc0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
2dcd0 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
2dce0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
2dcf0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
2dd00 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
2dd10 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2dd20 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
2dd30 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
2dd40 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2dd50 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
2dd60 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
2dd70 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
2dd80 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2dd90 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2dda0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2ddb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2ddc0 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49  xprCompare(0, pI
2ddd0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
2dde0 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
2ddf0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2de00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2de20 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
2de30 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
2de40 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
2de50 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
2de60 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
2de70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
2de80 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2de90 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
2dea0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
2deb0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
2dec0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
2ded0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2dee0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2def0 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
2df00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2df10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2df20 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2df30 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
2df40 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
2df50 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
2df60 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2df70 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
2df80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2df90 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
2dfa0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2dfb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dfc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2dfd0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
2dfe0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2dff0 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
2e000 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
2e010 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
2e020 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2e030 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
2e040 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
2e050 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e060 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
2e070 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
2e080 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
2e090 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e0a0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
2e0b0 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2e0d0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
2e0e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2e0f0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2e100 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e110 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2e120 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2e130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e150 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
2e160 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
2e170 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
2e180 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
2e190 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
2e1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2e1b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2e1c0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2e1d0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2e1e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
2e1f0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2e200 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2e210 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2e220 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
2e230 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2e240 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2e250 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
2e260 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2e270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e280 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2e290 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2e2a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e2b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2e2c0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
2e2d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2e2e0 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
2e2f0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2e300 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
2e310 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
2e320 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72  lect);.  pWalker
2e330 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b  ->walkerDepth++;
2e340 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2e350 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2e360 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67   void analyzeAgg
2e370 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2e380 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nd(Walker *pWalk
2e390 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2e3a0 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2e3b0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2e3c0 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2e3d0 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a  lkerDepth--;.}..
2e3e0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2e3f0 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2e400 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2e410 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2e420 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2e430 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2e440 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2e450 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2e460 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2e470 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2e480 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2e490 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2e4a0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2e4b0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2e4c0 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2e4d0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2e4e0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2e4f0 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2e500 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2e510 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2e520 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2e530 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2e540 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2e550 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2e560 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2e570 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2e580 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2e590 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2e5a0 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2e5b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2e5c0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2e5d0 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2e5e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2e5f0 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  k2 = analyzeAggr
2e600 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2e610 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70  d;.  w.walkerDep
2e620 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e  th = 0;.  w.u.pN
2e630 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61  C = pNC;.  w.pPa
2e640 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  rse = 0;.  asser
2e650 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
2e660 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
2e670 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2e680 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
2e690 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
2e6a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2e6b0 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
2e6c0 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
2e6d0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
2e6e0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
2e6f0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
2e700 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2e710 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
2e720 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
2e730 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
2e740 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2e750 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
2e760 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
2e770 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
2e780 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2e790 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
2e7a0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
2e7b0 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
2e7c0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
2e7d0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
2e7e0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2e7f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2e800 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2e810 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
2e820 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2e830 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2e840 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
2e850 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
2e860 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
2e870 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2e880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e890 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
2e8a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
2e8b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2e8c0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
2e8d0 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
2e8e0 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
2e8f0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2e900 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
2e910 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
2e920 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
2e930 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
2e940 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2e950 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
2e960 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76  ** purpose..*/.v
2e970 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2e980 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
2e990 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2e9a0 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
2e9b0 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
2e9c0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
2e9d0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
2e9e0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  {.    pParse->aT
2e9f0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
2ea00 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
2ea10 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2ea20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
2ea30 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
2ea40 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
2ea50 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f  ve registers..*/
2ea60 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2ea70 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2ea80 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
2ea90 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
2eaa0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72   if( nReg==1 ) r
2eab0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74  eturn sqlite3Get
2eac0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2ead0 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
2eae0 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
2eaf0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2eb00 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
2eb10 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2eb20 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
2eb30 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
2eb40 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
2eb50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2eb60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2eb70 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
2eb80 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
2eb90 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
2eba0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2ebb0 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
2ebc0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2ebd0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
2ebe0 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
2ebf0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2ec00 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2ec10 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65  e, iReg);.    re
2ec20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
2ec30 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
2ec40 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
2ec50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2ec60 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2ec70 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
2ec80 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2ec90 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
2eca0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
2ecb0 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
2ecc0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
2ecd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2ece0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2ecf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2ed00 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
2ed10 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
2ed20 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2ed30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
2ed40 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
2ed50 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
2ed60 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
2ed70 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
2ed80 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
2ed90 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
2eda0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2edb0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
2edc0 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
2edd0 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
2ede0 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
2edf0 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
2ee00 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2ee10 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
2ee20 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
2ee30 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
2ee40 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
2ee50 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2ee60 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
2ee70 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72  nRangeReg > iFir
2ee80 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d  st.   && pParse-
2ee90 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c  >iRangeReg <= iL
2eea0 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65  ast.  ){.     re
2eeb0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
2eec0 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
2eed0 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b  >nTempReg; i++){
2eee0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
2eef0 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46  >aTempReg[i]>=iF
2ef00 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e  irst && pParse->
2ef10 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61  aTempReg[i]<=iLa
2ef20 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
2ef30 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
2ef40 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2ef50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2ef60 45 42 55 47 20 2a 2f 0a                          EBUG */.