/ Hex Artifact Content
Login

Artifact 1c2157f34cd8ad26d757df245def39438c2b8d2a629910d38e1fb9b3f9995be7:


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 28 6f 70 3d 3d 54 4b 5f      if( (op==TK_
1230: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
1240: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1250: 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f        || op==TK_
1260: 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d  REGISTER || op==
1270: 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  TK_TRIGGER).    
1280: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
1290: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
12a0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
12b0: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
12c0: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45   happens when pE
12d0: 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  xpr was original
12e0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b  ly.      ** a TK
12f0: 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20  _COLUMN but was 
1300: 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75  previously evalu
1310: 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20  ated and cached 
1320: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  in a register */
1330: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1340: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1350: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1360: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1370: 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 79 2e 70 54  *zColl = p->y.pT
1380: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1390: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
13a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
13b0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
13c0: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
13d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13f0: 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20   op==TK_CAST || 
1400: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op==TK_UPLUS ){.
1410: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
1420: 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ft;.      contin
1430: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1440: 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ( op==TK_COLLATE
1450: 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49   || (op==TK_REGI
1460: 53 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d  STER && p->op2==
1470: 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20  TK_COLLATE) ){. 
1480: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1490: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
14a0: 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20  Parse, ENC(db), 
14b0: 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  0, p->u.zToken);
14c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
14e0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
14f0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
1500: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1510: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1520: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1530: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1540: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1550: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1560: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1570: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1580: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1590: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
15a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
15b0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
15c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
15d0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
15e0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
15f0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
1600: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1610: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1620: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1630: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1640: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1650: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1660: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1670: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1680: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1690: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
16a0: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
16b0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
16c0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
16d0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
16e0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
16f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
1700: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1710: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1720: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1730: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1740: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1750: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1760: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1770: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1780: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1790: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
17b0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
17c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
17f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1810: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1820: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1840: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1850: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1860: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1880: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1890: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ll;.}../*.** Ret
18a0: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  urn the collatio
18b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
18c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
18d0: 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65  xpr. If.** there
18e0: 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63   is no defined c
18f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1900: 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
1910: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65  ter to the.** de
1920: 66 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20  fautl collation 
1930: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
1940: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
1950: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a  3ExprCollSeq().*
1960: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1970: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f  ExprCollSeq() ro
1980: 75 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20  utine works the 
1990: 73 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74  same except that
19a0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e   it.** returns N
19b0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
19c0: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
19d0: 74 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  tion..*/.CollSeq
19e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43   *sqlite3ExprNNC
19f0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
1a00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a10: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
1a20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
1a40: 78 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  xpr);.  if( p==0
1a50: 20 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64   ) p = pParse->d
1a60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1a70: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1a80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1a90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1aa0: 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1ab0: 65 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75  essions have equ
1ac0: 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  ivalent collatin
1ad0: 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a  g sequences..*/.
1ae0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1af0: 6f 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73  ollSeqMatch(Pars
1b00: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b10: 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29  *pE1, Expr *pE2)
1b20: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1b30: 6c 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll1 = sqlite3Exp
1b40: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1b50: 65 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53  e, pE1);.  CollS
1b60: 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c  eq *pColl2 = sql
1b70: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1b80: 71 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  q(pParse, pE2);.
1b90: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ba0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e  StrICmp(pColl1->
1bb0: 7a 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a  zName, pColl2->z
1bc0: 4e 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Name)==0;.}../*.
1bd0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
1be0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
1bf0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c00: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
1c10: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
1c20: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
1c30: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1c40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
1c50: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
1c60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
1c70: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
1c80: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c90: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
1ca0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1cc0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
1cd0: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
1ce0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
1cf0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
1d00: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
1d10: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
1d20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
1d30: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
1d40: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
1d50: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
1d60: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
1d70: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
1d80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1d90: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
1da0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
1db0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
1dc0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
1dd0: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
1de0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
1df0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
1e00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e10: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1e30: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
1e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
1e50: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
1e60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
1e70: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
1e80: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
1e90: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
1ea0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1eb0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ed0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
1ee0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
1ef0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
1f00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
1f10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1f20: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
1f30: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1f40: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
1f50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
1f60: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
1f70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
1f80: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
1f90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
1fa0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
1fb0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
1fc0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
1fd0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
1fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1ff0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
2000: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
2010: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
2020: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2030: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
2040: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
2050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2060: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
2070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
2080: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2090: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
20a0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
20b0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
20c0: 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_NE || pExpr->o
20d0: 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70  p==TK_IS || pExp
20e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
20f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
2100: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61  pr->pLeft );.  a
2110: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
2120: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
2130: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45  pLeft);.  if( pE
2140: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
2150: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
2160: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
2170: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
2180: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
2190: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21a0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
21b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66  lect) ){.    aff
21c0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
21d0: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
21e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
21f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
2200: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
2210: 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( aff==0 ){.    
2220: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
2230: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
2240: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2250: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
2260: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
2270: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
2280: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
2290: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
22a0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
22b0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
22c0: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
22d0: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
22e0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
22f0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
2300: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2310: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
2320: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
2330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
2340: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
2350: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
2360: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
2370: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
2380: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
2390: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
23a0: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
23b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
23c0: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
23d0: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
23e0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
23f0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
2400: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2410: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
2420: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
2430: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
2440: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
2450: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
2460: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2470: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
2480: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2490: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
24a0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
24b0: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
24c0: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
24d0: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
24e0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
24f0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
2500: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
2510: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
2520: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
2530: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
2540: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
2550: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
2560: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
2570: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2580: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
2590: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
25a0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
25e0: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
25f0: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
2600: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
2610: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
2620: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
2630: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
2640: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
2650: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
2660: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2670: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
2680: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
2690: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
26a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
26b0: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
26c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
26d0: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
26e0: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
26f0: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
2700: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
2710: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
2720: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
2730: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
2740: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
2750: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
2760: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
2770: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
2780: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
2790: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
27a0: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
27b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
27c0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
27d0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
27e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
27f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
2800: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
2810: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
2820: 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  late ){.    pCol
2830: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2850: 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Left);.  }else i
2860: 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52  f( pRight && (pR
2870: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
2880: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
2890: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
28a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
28b0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
28c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
28d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
28f0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
2900: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2910: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2920: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2930: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
2940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2950: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
2960: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2970: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
2980: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
2990: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
29a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
29b0: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
29c0: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
29d0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
29e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
29f0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
2a00: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
2a10: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
2a20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
2a30: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2a40: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
2a50: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
2a60: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
2a70: 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32  int in1, int in2
2a80: 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f  , /* Register ho
2a90: 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a  lding operands *
2aa0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
2ab0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2ac0: 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a  re if true.  */.
2ad0: 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
2ae0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2af0: 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f  jump if either o
2b00: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a  perand is NULL *
2b10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20  /.){.  int p5;. 
2b20: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c   int addr;.  Col
2b30: 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20  lSeq *p4;..  p4 
2b40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
2b50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
2b60: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
2b70: 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e  ght);.  p5 = bin
2b80: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65  aryCompareP5(pLe
2b90: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
2ba0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20  IfNull);.  addr 
2bb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2bc0: 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op4(pParse->pVdb
2bd0: 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20  e, opcode, in2, 
2be0: 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20  dest, in1,.     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c        (void*)p4,
2c10: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
2c20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c30: 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62  eP5(pParse->pVdb
2c40: 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65  e, (u8)p5);.  re
2c50: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2c70: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  if expression pE
2c80: 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c  xpr is a vector,
2c90: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2ca0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63  ise..**.** A vec
2cb0: 74 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61  tor is defined a
2cc0: 73 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  s any expression
2cd0: 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e   that results in
2ce0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
2cf0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c  columns of resul
2d00: 74 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43  t.  Every TK_VEC
2d10: 54 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76  TOR node is an v
2d20: 65 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68  ector because th
2d30: 65 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c  e.** parser will
2d40: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20   not generate a 
2d50: 54 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66  TK_VECTOR with f
2d60: 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e  ewer than two en
2d70: 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20  tries..** But a 
2d80: 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20  TK_SELECT might 
2d90: 62 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74  be either a vect
2da0: 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20  or or a scalar. 
2db0: 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f  It is only.** co
2dc0: 6e 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f  nsidered a vecto
2dd0: 72 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20  r if it has two 
2de0: 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  or more result c
2df0: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  olumns..*/.int s
2e00: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
2e10: 6f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  or(Expr *pExpr){
2e20: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e30: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2e40: 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  pExpr)>1;.}../*.
2e50: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2e60: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
2e70: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2e80: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
2e90: 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e  ECTOR .** return
2ea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2eb0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
2ec0: 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66  e vector. Or, if
2ed0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
2ee0: 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
2ef0: 63 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ct, return the n
2f00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2f10: 20 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65   in the sub-sele
2f20: 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f  ct. For.** any o
2f30: 74 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70  ther type of exp
2f40: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
2f50: 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
2f60: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2f70: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2f80: 75 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  u8 op = pExpr->o
2f90: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
2fa0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
2fb0: 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66  pExpr->op2;.  if
2fc0: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
2fd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45  ){.    return pE
2fe0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2ff0: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xpr;.  }else if(
3000: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
3010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
3020: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
3030: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3040: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3050: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
3060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
3070: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
3080: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
3090: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
30a0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
30b0: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
30c0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
30d0: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
30e0: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
30f0: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
3100: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
3110: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
3120: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
3130: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
3140: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
3150: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
3160: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
3170: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
3180: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
3190: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
31a0: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
31b0: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
31c0: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
31d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
31e0: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
31f0: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
3200: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
3210: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
3220: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
3230: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
3240: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
3250: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
3260: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
3270: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
3280: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
3290: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
32a0: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
32b0: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
32c0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
32d0: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
32e0: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
32f0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
3300: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
3310: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
3320: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
3330: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
3340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3350: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20  pVector->op2==0 
3360: 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  || pVector->op==
3370: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
3380: 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e     if( pVector->
3390: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c  op==TK_SELECT ||
33a0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54   pVector->op2==T
33b0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
33c0: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
33d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
33e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
33f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3400: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3410: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
3420: 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  pExpr;.    }.  }
3430: 0a 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  .  return pVecto
3440: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  r;.}../*.** Comp
3450: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
3460: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
3470: 20 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73   which when pass
3480: 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ed to.** sqlite3
3490: 45 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20  ExprCode() will 
34a0: 67 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63  generate all nec
34b0: 65 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63  essary code to c
34c0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46  ompute.** the iF
34d0: 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  ield-th column o
34e0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70  f the vector exp
34f0: 72 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e  ression pVector.
3500: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20  .**.** It is ok 
3510: 66 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62  for pVector to b
3520: 65 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c  e a scalar (as l
3530: 6f 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30  ong as iField==0
3540: 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ).  .** In that 
3550: 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
3560: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ne works like sq
3570: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a  lite3ExprDup()..
3580: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3590: 20 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e   owns the return
35a0: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  ed Expr object a
35b0: 6e 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  nd is responsibl
35c0: 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e  e for.** ensurin
35d0: 67 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  g that the retur
35e0: 6e 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75  ned value eventu
35f0: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
3600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
3610: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3620: 68 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20  hip of pVector. 
3630: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
3640: 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74   TK_SELECT,.** t
3650: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
3660: 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66   object will ref
3670: 65 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61  erence pVector a
3680: 6e 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75  nd so pVector mu
3690: 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c  st remain.** val
36a0: 69 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20  id for the life 
36b0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
36c0: 6f 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63  object.  If pVec
36d0: 74 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54  tor is a TK_VECT
36e0: 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61  OR.** or a scala
36f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  r expression, th
3700: 65 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c  en it can be del
3710: 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  eted as soon as 
3720: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  returns..**.** A
3740: 20 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20   trick to cause 
3750: 61 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63  a TK_SELECT pVec
3760: 74 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65  tor to be delete
3770: 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a  d together with.
3780: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
3790: 45 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74  Expr object is t
37a0: 6f 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65  o attach the pVe
37b0: 63 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67  ctor to the pRig
37c0: 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74  ht field.** of t
37d0: 68 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53  he returned TK_S
37e0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
37f0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70  r object..*/.Exp
3800: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f  r *sqlite3ExprFo
3810: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20  rVectorField(.  
3820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3830: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3850: 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20  r *pVector,     
3860: 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e    /* The vector.
3870: 20 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73    List of expres
3880: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53  sions or a sub-S
3890: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69  ELECT */.  int i
38a0: 46 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20  Field           
38b0: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
38c0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f  of the vector to
38d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20   return */.){.  
38e0: 45 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66  Expr *pRet;.  if
38f0: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3900: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
3910: 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d  assert( pVector-
3920: 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
3930: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20  elect );.    /* 
3940: 54 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  The TK_SELECT_CO
3950: 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a  LUMN Expr node:.
3960: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c      **.    ** pL
3970: 65 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70  eft:           p
3980: 56 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e  Vector containin
3990: 67 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f  g TK_SELECT.  No
39a0: 74 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  t deleted..    *
39b0: 2a 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20  * pRight:       
39c0: 20 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75     not used.  Bu
39d0: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65  t recursively de
39e0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43  leted..    ** iC
39f0: 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49  olumn:         I
3a00: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
3a10: 20 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20   in pVector.    
3a20: 2a 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20  ** iTable:      
3a30: 20 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d      0 or the num
3a40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
3a50: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20  n the LHS of an 
3a60: 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a  assignment.    *
3a70: 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a  * pLeft->iTable:
3a80: 20 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61     First in an a
3a90: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
3aa0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c   holding result,
3ab0: 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20   or 0.    **    
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3ad0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
3ae0: 6f 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e  ot yet computed.
3af0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
3b00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b10: 28 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  () specifically 
3b20: 73 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73  skips the recurs
3b30: 69 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20  ive delete of.  
3b40: 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b    ** pLeft on TK
3b50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3b60: 6f 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68  odes.  But pRigh
3b70: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73  t is followed, s
3b80: 6f 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a  o pVector.    **
3b90: 20 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64   can be attached
3ba0: 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61   to pRight to ca
3bb0: 75 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f  use this node to
3bc0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
3bd0: 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f  of.    ** pVecto
3be0: 72 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  r.  Typically th
3bf0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74  ere will be mult
3c00: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3c10: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20  OLUMN nodes.    
3c20: 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
3c30: 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74   pLeft pointer t
3c40: 6f 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62  o the pVector, b
3c50: 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  ut only one of t
3c60: 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  hem.    ** will 
3c70: 6f 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e  own the pVector.
3c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74  .    */.    pRet
3c90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
3ca0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
3cb0: 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  T_COLUMN, 0, 0);
3cc0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
3cd0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f  .      pRet->iCo
3ce0: 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20  lumn = iField;. 
3cf0: 20 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74       pRet->pLeft
3d00: 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20   = pVector;.    
3d10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
3d20: 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69  et==0 || pRet->i
3d30: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65  Table==0 );.  }e
3d40: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65  lse{.    if( pVe
3d50: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43  ctor->op==TK_VEC
3d60: 54 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20  TOR ) pVector = 
3d70: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3d80: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3d90: 72 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  r;.    pRet = sq
3da0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3db0: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3dc0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
3dd0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
3de0: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3df0: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3e00: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3e10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3e20: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3e30: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3e40: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3e50: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3e60: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3e70: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3e80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3e90: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ea0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3eb0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3ee0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3ef0: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3f00: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3f10: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3f20: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3f30: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3f40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3f50: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3f60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3f70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3f80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3f90: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3fa0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3fb0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3fc0: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3fd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3fe0: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3ff0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
4000: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
4010: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
4020: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
4030: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
4040: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
4050: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
4060: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
4070: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4080: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
4090: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
40a0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
40b0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
40c0: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
40d0: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
40f0: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
4100: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
4110: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
4120: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
4130: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
4140: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
4150: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4160: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
4170: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
4180: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
4190: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
41a0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
41b0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
41c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
41d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
41e0: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
41f0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
4200: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
4210: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
4220: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
4230: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
4240: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
4250: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
4260: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
4270: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
4280: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
4290: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
42a0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
42b0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
42c0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
42d0: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
42e0: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
42f0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
4300: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
4310: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
4320: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
4330: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
4340: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
4350: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
4360: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
4370: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
43a0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43c0: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
43d0: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
43e0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4410: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4420: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4430: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4450: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
4460: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
4470: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
44a0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
44b0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44d0: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
44e0: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
44f0: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4500: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4510: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4520: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4530: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4540: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4550: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
4560: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
4570: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
4580: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
4590: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
45a0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
45b0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
45c0: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
45d0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
45e0: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
45f0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4600: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4610: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4620: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4630: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4640: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4650: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
4660: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
4670: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
4680: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
4690: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
46a0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
46b0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
46c0: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
46d0: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
46e0: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
46f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4700: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4710: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4720: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4730: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4740: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4750: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
4760: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
4770: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
4780: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
4790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47a0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
47b0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
47c0: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
47d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47e0: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
47f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4800: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4810: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4820: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4830: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4850: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
4860: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4870: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
4880: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
4890: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
48a0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
48b0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
48c0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
48d0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
48e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
48f0: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4900: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4910: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4920: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4930: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4940: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4950: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
4960: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
4970: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4980: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4990: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
49a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
49b0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
49c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
49d0: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
49e0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
49f0: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4a00: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4a10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4a20: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4a30: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4a40: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4a50: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4a60: 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  );..  if( nLeft!
4a70: 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  =sqlite3ExprVect
4a80: 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29  orSize(pRight) )
4a90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4aa0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
4ab0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
4ac0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
4ad0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
4ae0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
4af0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b00: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4b10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4b20: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b30: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4b40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b50: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
4b60: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
4b70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b80: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
4b90: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
4ba0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4bb0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4bc0: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4bd0: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4be0: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
4bf0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
4c00: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4c10: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4c20: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4c30: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4c40: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4c50: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
4c60: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
4c70: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
4c80: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
4c90: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
4ca0: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
4cb0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
4cc0: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
4cd0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4ce0: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
4cf0: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4d00: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4d10: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4d20: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4d30: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4d50: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
4d60: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
4d70: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
4d80: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
4d90: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
4da0: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
4db0: 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f    r1 = exprVecto
4dc0: 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  rRegister(pParse
4dd0: 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c  , pLeft, i, regL
4de0: 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72  eft, &pL, &regFr
4df0: 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65  ee1);.    r2 = e
4e00: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4e10: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
4e20: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
4e30: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
4e40: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
4e50: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
4e60: 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73  opx, r1, r2, des
4e70: 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74  t, p5);.    test
4e80: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
4e90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ea0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
4eb0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4ec0: 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
4ed0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ee0: 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
4ef0: 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
4f00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f10: 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65  ==OP_Gt);.    te
4f20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
4f30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
4f50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f60: 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
4f70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f80: 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Eq);.    testca
4f90: 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
4fa0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fb0: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
4fc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4fd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4fe0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c  gFree1);.    sql
4ff0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5000: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
5010: 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  ee2);.    if( i=
5020: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
5030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5040: 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45     if( opx==TK_E
5050: 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q ){.      sqlit
5060: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5070: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
5080: 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43  addrDone); VdbeC
5090: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
50a0: 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b    p5 |= SQLITE_K
50b0: 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  EEPNULL;.    }el
50c0: 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e  se if( opx==TK_N
50d0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
50e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
50f0: 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64  OP_If, dest, add
5100: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
5110: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
5120: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5130: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
5140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
5150: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p==TK_LT || op==
5160: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_GT || op==TK_
5170: 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20  LE || op==TK_GE 
5180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51a0: 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61  _ElseNotEq, 0, a
51b0: 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  ddrDone);.      
51c0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
51d0: 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  , op==TK_LT);.  
51e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
51f0: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29  If(v, op==TK_GT)
5200: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5210: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
5220: 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LE);.      Vdbe
5230: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5240: 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20  ==TK_GE);.      
5250: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
5260: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d   opx = op;.    }
5270: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5280: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5290: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a  , addrDone);.}..
52a0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
52b0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
52c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
52d0: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
52e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
52f0: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5300: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
5310: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
5320: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
5330: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5340: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
5350: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5360: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5380: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
5390: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
53a0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
53b0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
53c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
53d0: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
53e0: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
53f0: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
5400: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5410: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
5420: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
5430: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
5440: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
5450: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
5460: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
5470: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5480: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
54a0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
54b0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
54c0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
54d0: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
54e0: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
54f0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
5500: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
5510: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
5520: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5530: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
5540: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5550: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
5560: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
5570: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
5580: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
5590: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
55a0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
55b0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
55c0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
55d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
55e0: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
55f0: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
5600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5610: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
5620: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
5630: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
5650: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
5660: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
5670: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
5680: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5690: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
56a0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
56b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
56c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
56d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
56e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
56f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5700: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5710: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
5720: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
5730: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5740: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
5750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69  lect *pSelect, i
5760: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5770: 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f   Select *p;.  fo
5780: 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20  r(p=pSelect; p; 
5790: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
57a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57b0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
57c0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57d0: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
57e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57f0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5800: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
5810: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5820: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5830: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5840: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5850: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5860: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5870: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5880: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5890: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
58a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
58b0: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
58c0: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
58d0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
58e0: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
58f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
5900: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
5910: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
5920: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
5930: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
5940: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
5950: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
5960: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
5970: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5980: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5990: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
59a0: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
59b0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  one..**.** Also 
59c0: 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f  propagate EP_Pro
59d0: 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20  pagate flags up 
59e0: 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73  from Expr.x.pLis
59f0: 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c  t to Expr.flags,
5a00: 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61  .** if appropria
5a10: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
5a20: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
5a30: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
5a40: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5a50: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5a60: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
5a70: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5a80: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
5a90: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
5aa0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ab0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5ac0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
5ad0: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
5ae0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
5af0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c  else if( p->x.pL
5b00: 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ist ){.    heigh
5b10: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78  tOfExprList(p->x
5b20: 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74  .pList, &nHeight
5b30: 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  );.    p->flags 
5b40: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
5b50: 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
5b60: 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73  tFlags(p->x.pLis
5b70: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
5b80: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5b90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
5ba0: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
5bb0: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
5bc0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
5bd0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
5be0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
5bf0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5c00: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5c10: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
5c20: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
5c30: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
5c40: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5c50: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
5c60: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
5c70: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
5c80: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
5c90: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
5ca0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5cb0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
5cc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5cd0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50  pr *p){.  if( pP
5ce0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
5cf0: 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65  urn;.  exprSetHe
5d00: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
5d10: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
5d20: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
5d30: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
5d40: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
5d50: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5d60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5d70: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
5d80: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
5d90: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
5da0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
5db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
5dc0: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
5dd0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
5de0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5df0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
5e00: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
5e10: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
5e20: 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20  else /* ABOVE:  
5e30: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5e40: 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c  nt enabled.  BEL
5e50: 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72  OW: Height enfor
5e60: 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a  cement off */./*
5e70: 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c  .** Propagate al
5e80: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5e90: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5ea0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5eb0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ed0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5ee0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5ef0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5f00: 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c  if( p && p->x.pL
5f10: 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50  ist && !ExprHasP
5f20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5f30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5f40: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5f50: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5f60: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5f70: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5f80: 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53  .}.#define exprS
5f90: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
5fa0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
5fb0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
5fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5fd0: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
5fe0: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
5ff0: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
6000: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
6010: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
6020: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
6030: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
6040: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
6050: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
6060: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
6070: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
6080: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
6090: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
60a0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
60b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
60c0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
60d0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
60e0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
60f0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
6100: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
6110: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
6120: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
6130: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
6140: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
6150: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
6160: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
6170: 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68  s performed.  Th
6180: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
6190: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
61a0: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
61b0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
61c0: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
61d0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
61e0: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
61f0: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
6200: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
6210: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
6220: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
6230: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
6240: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
6250: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
6260: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
6270: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
6280: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
6290: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
62a0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
62b0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
62c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
62d0: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
62e0: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
62f0: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
6300: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
6310: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
6320: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
6330: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
6340: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
6350: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
6360: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
6370: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
6380: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
6390: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
63a0: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
63b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
63c0: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
63d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
63e0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
63f0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
6400: 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20  locRawNN() */.  
6410: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6420: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6430: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
6440: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
6450: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
6460: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6470: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6480: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
64a0: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
64b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
64c0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
64d0: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
64e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
64f0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6500: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
6510: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
6520: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
6530: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
6540: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
6550: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
6560: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6570: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6580: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6590: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
65a0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
65b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
65c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
65d0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
65e0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
65f0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6600: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6610: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
6620: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
6630: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6640: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6650: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
6660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6670: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6680: 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b  ntValue|EP_Leaf;
6690: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66a0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
66d0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
66e0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
66f0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6700: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6710: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6720: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6730: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6740: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6750: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6760: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6770: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
6780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
6790: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67a0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
67d0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
67e0: 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  ]=='"' ) pNew->f
67f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
6800: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  oted;.          
6810: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
6820: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
6830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6840: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
6850: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6860: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
6870: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
6880: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
6890: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68a0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
68b0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
68c0: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
68d0: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
68e0: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
68f0: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6900: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6910: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6920: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6930: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6950: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
6960: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6990: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69a0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
69b0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
69c0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
69d0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
69e0: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
69f0: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a10: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a20: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a30: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a40: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6a50: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6a60: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6a70: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6a80: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6a90: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6aa0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6ab0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6ac0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6ad0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6ae0: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6af0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b00: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b10: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b20: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b30: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b40: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6b50: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6b60: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6b70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6b80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6b90: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6bc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6bd0: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6be0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6bf0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c00: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c10: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c20: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c30: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c40: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6c50: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6c60: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6c70: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6c80: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6c90: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6ca0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6cc0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6ce0: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6cf0: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d00: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d10: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d20: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d30: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d40: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6d50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6d60: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6d70: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6d80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6d90: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6db0: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6dc0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6dd0: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6de0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6df0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e30: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e40: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6e50: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6e60: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6e70: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6e80: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6e90: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ea0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6eb0: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6ec0: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6ed0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6ee0: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6ef0: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6f00: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6f10: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6f20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6f30: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6f40: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6f50: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6f60: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
6f70: 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
6f80: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  ->db, sizeof(Exp
6f90: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  r));.    if( p )
6fa0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
6fb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6fc0: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20  ));.      p->op 
6fd0: 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  = op & TKFLG_MAS
6fe0: 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67  K;.      p->iAgg
6ff0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
7000: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7010: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
7020: 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c  e->db, p, pLeft,
7030: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7040: 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71  if( p ) {.    sq
7050: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
7060: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
7070: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
7080: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7090: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
70a0: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
70b0: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70c0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70d0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70f0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
7100: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
7110: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7120: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7130: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7140: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7150: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7160: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7170: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7180: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7190: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
71a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
71b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71c0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71d0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71e0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71f0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
7200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7210: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7220: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7230: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7240: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7250: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7260: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
7270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
7280: 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55 45  ways either TRUE
7290: 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70 65   or FALSE (respe
72a0: 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65  ctively),.** the
72b0: 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  n return 1.  If 
72c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72  one cannot deter
72d0: 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20 76  mine the truth v
72e0: 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65  alue of the.** e
72f0: 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d  xpression at com
7300: 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72 6e  pile-time return
7310: 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69   0..**.** This i
7320: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
7330: 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 20  n.  If is OK to 
7340: 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76  return 0 here ev
7350: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78 70  en if.** the exp
7360: 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69  ression really i
7370: 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 6f  s always false o
7380: 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73 65  r false (a false
7390: 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42   negative)..** B
73a0: 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20 74  ut it is a bug t
73b0: 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74 68  o return 1 if th
73c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
73d0: 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ht have differen
73e0: 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  t.** boolean val
73f0: 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  ues in different
7400: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28   circumstances (
7410: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
7420: 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  .).**.** Note th
7430: 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  at if the expres
7440: 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  sion is part of 
7450: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20  conditional for 
7460: 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  a.** LEFT JOIN, 
7470: 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64  then we cannot d
7480: 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70  etermine at comp
7490: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
74a0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74   or not.** is it
74b0: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20   true or false, 
74c0: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
74d0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
74e0: 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  t exprAlwaysTrue
74f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
7500: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7510: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7520: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7540: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7550: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7560: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7570: 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63  n v!=0;.}.static
7580: 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46   int exprAlwaysF
7590: 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  alse(Expr *p){. 
75a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
75b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
75c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
75d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
75e0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
75f0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
7600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7610: 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn v==0;.}../
7620: 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78  *.** Join two ex
7630: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
7640: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
7650: 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72    If either expr
7660: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c  ession is.** NUL
7670: 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  L, then just ret
7680: 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78  urn the other ex
7690: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
76a0: 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  If one side or t
76b0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
76c0: 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  AND is known to 
76d0: 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69  be false, then i
76e0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74  nstead.** of ret
76f0: 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78  urning an AND ex
7700: 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72  pression, just r
7710: 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74  eturn a constant
7720: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
7730: 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66  .** a value of f
7740: 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  alse..*/.Expr *s
7750: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
7760: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7770: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
7780: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
7790: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
77a0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
77b0: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
77c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77d0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69  pLeft;.  }else i
77e0: 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
77f0: 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70  se(pLeft) || exp
7800: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69  rAlwaysFalse(pRi
7810: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
7820: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7830: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
7840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7850: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  db, pRight);.   
7860: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
7870: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7880: 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
7890: 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30  3IntTokens[0], 0
78a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
78b0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
78c0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
78d0: 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b  , TK_AND, 0, 0);
78e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
78f0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64  AttachSubtrees(d
7900: 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20  b, pNew, pLeft, 
7910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
7920: 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  urn pNew;.  }.}.
7930: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
7940: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
7950: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
7960: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
7970: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
7980: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
7990: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a  e3ExprFunction(.
79a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
79b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
79c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
79d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
79e0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
79f0: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  t list */.  Toke
7a00: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20  n *pToken,      
7a10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7a20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
7a30: 6e 74 20 65 44 69 73 74 69 6e 63 74 20 20 20 20  nt eDistinct    
7a40: 20 20 20 20 20 2f 2a 20 53 46 5f 44 69 73 74 69       /* SF_Disti
7a50: 6e 63 74 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72  nct or SF_ALL or
7a60: 20 30 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20   0 */.){.  Expr 
7a70: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7a80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7aa0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7ab0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7ac0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7ad0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7ae0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7af0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7b00: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7b10: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7b20: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7b30: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7b40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7b50: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
7b60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70  pList->nExpr > p
7b70: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
7b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
7b90: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a  UNCTION_ARG] ){.
7ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7bb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
7bc0: 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20   many arguments 
7bd0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c  on function %T",
7be0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
7bf0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
7c00: 70 4c 69 73 74 3b 0a 20 20 45 78 70 72 53 65 74  pList;.  ExprSet
7c10: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7c20: 50 5f 48 61 73 46 75 6e 63 29 3b 0a 20 20 61 73  P_HasFunc);.  as
7c30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7c40: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
7c50: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
7c60: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
7c70: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7c80: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  rse, pNew);.  if
7c90: 28 20 65 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f  ( eDistinct==SF_
7ca0: 44 69 73 74 69 6e 63 74 20 29 20 45 78 70 72 53  Distinct ) ExprS
7cb0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  etProperty(pNew,
7cc0: 20 45 50 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20   EP_Distinct);. 
7cd0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7ce0: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
7cf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7d00: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7d10: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
7d20: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
7d30: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7d40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
7d50: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
7d60: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
7d70: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
7d80: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
7d90: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
7da0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
7db0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7dc0: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
7dd0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
7de0: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
7df0: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
7e00: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
7e10: 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20 61 20   big to avoid a 
7e20: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
7e30: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
7e40: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7e50: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
7e60: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
7e70: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7e80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
7e90: 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72  aaa", "@aaa", or
7ea0: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
7eb0: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
7ec0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
7ed0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
7ee0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
7ef0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
7f00: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
7f10: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
7f20: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
7f30: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
7f40: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7f50: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
7f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f70: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
7f80: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
7f90: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
7fa0: 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65  u32 n){.  sqlite
7fb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7fc0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
7fd0: 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a   *z;.  ynVar x;.
7fe0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8000: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8010: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
8020: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
8030: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
8040: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
8050: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
8060: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
8070: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
8080: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
8090: 75 33 32 29 73 71 6c 69 74 65 33 53 74 72 6c 65  u32)sqlite3Strle
80a0: 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20  n30(z) );.  if( 
80b0: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
80c0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
80d0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
80e0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
8110: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d  =='?' );.    x =
8120: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8130: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73  e->nVar);.  }els
8140: 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64  e{.    int doAdd
8150: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b   = 0;.    if( z[
8160: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
8170: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
8180: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
8190: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
81a0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
81b0: 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69  d.      ** use i
81c0: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
81d0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
81e0: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69    i64 i;.      i
81f0: 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66  nt bOk;.      if
8200: 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49  ( n==2 ){ /*OPTI
8210: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45  MIZATION-IF-TRUE
8220: 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d 20 7a  */.        i = z
8230: 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65  [1]-'0';  /* The
8240: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
8250: 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ?N for a single 
8260: 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20  digit N */.     
8270: 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
8280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8290: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
82a0: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
82b0: 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55  i, n-1, SQLITE_U
82c0: 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
82d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
82e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
82f0: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
8300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
8310: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
8320: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8330: 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20  E_NUMBER]-1 );. 
8340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
8350: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
8360: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8370: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
8380: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
8390: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
83a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
83b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
83c0: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ER] ){.        s
83d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
83e0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
83f0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
8400: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
8410: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
8420: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
8430: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8440: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
8450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8460: 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20 28 79    }.      x = (y
8470: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 69 66  nVar)i;.      if
8480: 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( x>pParse->nVar
8490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
84a0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
84b0: 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  x;.        doAdd
84c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
84d0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 56 4c 69  e if( sqlite3VLi
84e0: 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72  stNumToName(pPar
84f0: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d  se->pVList, x)==
8500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 41  0 ){.        doA
8510: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8530: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
8540: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
8550: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
8560: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8570: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
8580: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
8590: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
85a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
85b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
85c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
85d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
85e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
85f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
8600: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
8610: 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71 6c 69   x = (ynVar)sqli
8620: 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75  te3VListNameToNu
8630: 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  m(pParse->pVList
8640: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  , z, n);.      i
8650: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
8660: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8670: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8680: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8690: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
86a0: 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64 20 29  .    if( doAdd )
86b0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
86c0: 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pVList = sqlite3
86d0: 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70 50 61  VListAdd(db, pPa
86e0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
86f0: 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  n, x);.    }.  }
8700: 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  .  pExpr->iColum
8710: 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78 3e 64  n = x;.  if( x>d
8720: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8730: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8740: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
8750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8770: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
8780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8790: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
87a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
87b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
87c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
87d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
87e0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
87f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8800: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8810: 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ;.  /* Sanity ch
8820: 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74  eck: Assert that
8830: 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73   the IntValue is
8840: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66   non-negative if
8850: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
8860: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
8880: 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75  ntValue) || p->u
8890: 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20  .iValue>=0 );.. 
88a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
88b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
88c0: 57 69 6e 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79  WinFunc) || p->y
88d0: 2e 70 57 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e  .pWin!=0 || db->
88e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
88f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
8900: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
8910: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8920: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
8930: 45 50 5f 52 65 64 75 63 65 64 29 0a 20 20 20 20  EP_Reduced).    
8940: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57        || p->y.pW
8950: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
8960: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57  Property(p, EP_W
8970: 69 6e 46 75 6e 63 29 20 29 3b 0a 23 69 66 64 65  inFunc) );.#ifde
8980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8990: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
89a0: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
89b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
89c0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
89d0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
89e0: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
89f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8a00: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8a10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8a20: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
8a30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8a40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8a50: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
8a60: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
8a70: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
8a80: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8a90: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8aa0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8ab0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8ac0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8ad0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8ae0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8af0: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
8b00: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8b10: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8b20: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
8b30: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eft);.    if( p-
8b40: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8b50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b60: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67  teNN(db, p->pRig
8b70: 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ht);.    }else i
8b80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b90: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8ba0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
8bb0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
8bc0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
8bd0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8be0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8bf0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8c00: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8c10: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
8c20: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8c30: 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
8c40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
8c50: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
8c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
8c70: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
8c80: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  >y.pWin);.    }.
8c90: 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
8ca0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8cb0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69  MemToken) ) sqli
8cc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8cd0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  >u.zToken);.  if
8ce0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8cf0: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
8d00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8d10: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
8d20: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8d30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8d40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8d50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8d60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8d70: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
8d80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8d90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8da0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8db0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8dc0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8dd0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8de0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8df0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8e00: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8e10: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8e20: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8e30: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8e40: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8e50: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8e60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8e70: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8e80: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8e90: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8ea0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8eb0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8ec0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8ed0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8ee0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8ef0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8f00: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8f10: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8f20: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8f30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8f40: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8f50: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8f60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8f80: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8f90: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8fa0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8fb0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8fc0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8fd0: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8fe0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8ff0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
9000: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
9010: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
9020: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
9030: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
9040: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
9050: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
9060: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
9070: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
9080: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
90d0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
90e0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
90f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9100: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
9110: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
9120: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
9130: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
9140: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9150: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
9160: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
9170: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
9180: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
9190: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
91a0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
91b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
91c0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
91d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
91e0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
91f0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
9200: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
9210: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
9220: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
9230: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
9240: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
9250: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
9260: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9270: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9280: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9290: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
92a0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
92b0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
92c0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
92d0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
92e0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
92f0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9300: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
9310: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9320: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
9330: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
9340: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
9350: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
9360: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9370: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9380: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9390: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
93a0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
93b0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
93c0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
93d0: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
93e0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
93f0: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9400: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
9410: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
9420: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
9430: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
9440: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
9450: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
9460: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9470: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9480: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9490: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
94a0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
94b0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
94c0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
94d0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
94e0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
94f0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9500: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
9510: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
9520: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
9530: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
9540: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9550: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
9560: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9570: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9580: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9590: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
95a0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
95b0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
95c0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
95d0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
95e0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
95f0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9600: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
9610: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9620: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9630: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9640: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9650: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9660: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9670: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9680: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96a0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
96b0: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
96c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
96d0: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
96e0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
96f0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9700: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9710: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9720: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
9730: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
9740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9750: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9760: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9770: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9790: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
97a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
97b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
97c0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
97d0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
97e0: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
97f0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9800: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
9810: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
9820: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9840: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9850: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
9860: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9870: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9890: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
98a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
98b0: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
98c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98d0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
98e0: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
98f0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9900: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9910: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
9920: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
9930: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
9940: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9950: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
9960: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9970: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9980: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9990: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
99a0: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
99b0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
99c0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
99d0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
99e0: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
99f0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9a00: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
9a10: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9a20: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9a50: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9a60: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9a70: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9a80: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9a90: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9aa0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9ab0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9ac0: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9ad0: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9ae0: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9af0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9b00: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
9b10: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9b20: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9b30: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9b40: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9b50: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
9b60: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9b70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9b80: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9b90: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9ba0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9bb0: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9bc0: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9bd0: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9be0: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9bf0: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9c00: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
9c10: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9c20: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9c30: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9c40: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9c50: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
9c60: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9c70: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9c80: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9c90: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9ca0: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9cb0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9cc0: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9cd0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9ce0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9cf0: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9d00: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9d10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9d20: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9d30: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9d40: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9d50: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9d60: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9d80: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9d90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9da0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9db0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9dc0: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9dd0: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9de0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9df0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9e00: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9e10: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9e20: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9e30: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9e40: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9e50: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9e60: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9e70: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9e80: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9e90: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9ea0: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9eb0: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9ec0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9ed0: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9ee0: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9ef0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9f00: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9f10: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9f20: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9f30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9f40: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9f50: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9f60: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9f70: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9f80: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9fa0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9fb0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9fd0: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9fe0: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9ff0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
a000: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
a010: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
a020: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
a030: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
a040: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
a050: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
a060: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
a070: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
a080: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a090: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
a0a0: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
a0b0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
a0c0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
a0d0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
a0e0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
a0f0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
a100: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
a110: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a120: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
a130: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
a140: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
a150: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
a160: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
a170: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
a180: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
a190: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
a1a0: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
a1b0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
a1c0: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
a1d0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
a1e0: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
a1f0: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
a200: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
a210: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
a220: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
a230: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
a240: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
a250: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
a260: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a270: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a280: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a290: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a2a0: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a2b0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a2c0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a2d0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a2e0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a2f0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a300: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a310: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a320: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a330: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a340: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a350: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a360: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a370: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a380: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a390: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a3a0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a3b0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a3c0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a3d0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a3f0: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a400: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a410: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a420: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a430: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a440: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a450: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a460: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a480: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a490: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a4a0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a4b0: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a4c0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a4d0: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a4e0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a4f0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a500: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a510: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a520: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a530: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a540: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a550: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a560: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a570: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a580: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a590: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a5a0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a5b0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a5c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a5d0: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a5e0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a5f0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a600: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a610: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a620: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a630: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a640: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a650: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a660: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a670: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a680: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a690: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a6a0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a6b0: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a6c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a6d0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a6e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a6f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a700: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a710: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a720: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a730: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a740: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a750: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a760: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a770: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a780: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a790: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a7a0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a7b0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a7c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a7d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a7e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a7f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a800: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a810: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a820: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a830: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a840: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a850: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a860: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a870: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a880: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a890: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a8a0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a8b0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a8c0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a8d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a8e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a8f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a900: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a910: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a920: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a930: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a940: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a960: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a970: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a980: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a9b0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a9c0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a9d0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a9e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a9f0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
aa00: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
aa10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
aa20: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
aa30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
aa40: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
aa50: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
aa60: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
aa70: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
aa80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
aa90: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
aaa0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
aab0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
aac0: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
aad0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
aaf0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
ab00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ab10: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
ab20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ab30: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
ab40: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
ab50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
ab60: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
ab80: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
ab90: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
aba0: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
abb0: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
abc0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
abd0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
abe0: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
abf0: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
ac00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ac10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ac20: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
ac30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac40: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
ac50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
ac60: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
ac70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ac80: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aca0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
acb0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
acc0: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
acd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
ace0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
acf0: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
ad00: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
ad10: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
ad20: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
ad30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
ad40: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
ad50: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
ad60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ad70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ad80: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ad90: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ada0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
adb0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
adc0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
add0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
ade0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
adf0: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
ae00: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
ae10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ae20: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ae30: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ae40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ae50: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
ae60: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
ae70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
ae80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
ae90: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
aea0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
aeb0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
aec0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
aed0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
aee0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
aef0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
af00: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
af10: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
af20: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
af30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
af40: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
af50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
af70: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
af80: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
af90: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
afa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
afb0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
afc0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
afd0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
afe0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
aff0: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
b000: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b010: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
b020: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
b030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
b040: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
b050: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
b060: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
b070: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
b080: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
b090: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
b0a0: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
b0b0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
b0c0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
b0d0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
b0e0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b0f0: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
b100: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b110: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b120: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b130: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 45  K_FUNCTION && pE
b140: 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 29  xpr->y.pWin!=0 )
b150: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78  {.    assert( Ex
b160: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
b170: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
b180: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79   );.    pExpr->y
b190: 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 20  .pWin->pNextWin 
b1a0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
b1b0: 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20 20  lect->pWin;.    
b1c0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65  pWalker->u.pSele
b1d0: 63 74 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70 72  ct->pWin = pExpr
b1e0: 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20 20  ->y.pWin;.  }.  
b1f0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
b200: 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
b210: 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  t gatherSelectWi
b220: 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62  ndowsSelectCallb
b230: 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ack(Walker *pWal
b240: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
b250: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61  .  return p==pWa
b260: 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20  lker->u.pSelect 
b270: 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a  ? WRC_Continue :
b280: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74   WRC_Prune;.}.st
b290: 61 74 69 63 20 76 6f 69 64 20 67 61 74 68 65 72  atic void gather
b2a0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65  SelectWindows(Se
b2b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  lect *p){.  Walk
b2c0: 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
b2d0: 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72  allback = gather
b2e0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c  SelectWindowsCal
b2f0: 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65  lback;.  w.xSele
b300: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74  ctCallback = gat
b310: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b320: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a  SelectCallback;.
b330: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b340: 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  ack2 = 0;.  w.u.
b350: 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73  pSelect = p;.  s
b360: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
b370: 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69  (&w, p);.}.#endi
b380: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  f.../*.** The fo
b390: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
b3a0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
b3b0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
b3c0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
b3d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
b3e0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
b3f0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
b400: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
b410: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
b420: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
b430: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
b440: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
b450: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
b460: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
b470: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
b480: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
b490: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
b4a0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
b4b0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
b4c0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
b4d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b4e0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
b4f0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
b500: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
b510: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b520: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b530: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b540: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b550: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b560: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b570: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b580: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b590: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b5a0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b5b0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b5c0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b5d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b5e0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b5f0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b600: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b610: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b620: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b630: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b640: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b650: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b660: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b670: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b680: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b690: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b6a0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b6b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b6c0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b6d0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b6e0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b6f0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b700: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b710: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b720: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b730: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b740: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b750: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b760: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b770: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b780: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b790: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b7a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b7b0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b7c0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b7d0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b7e0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b7f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b800: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b810: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b820: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b830: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b840: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b850: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b870: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b880: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b890: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b8a0: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b8c0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b8d0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b8e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b8f0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b900: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b910: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b920: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b930: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b940: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b950: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b960: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b970: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b980: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b990: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b9a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b9b0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b9c0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b9d0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b9e0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b9f0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
ba00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
ba10: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
ba20: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
ba30: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
ba40: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
ba50: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
ba60: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
ba70: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ba80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ba90: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
baa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bab0: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
bac0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
bad0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
bae0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
baf0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
bb00: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
bb10: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
bb20: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
bb30: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
bb40: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
bb50: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
bb60: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
bb70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
bb80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bb90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bba0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bbb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
bbc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
bbd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bbe0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
bbf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
bc00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
bc10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
bc20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
bc30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
bc40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
bc50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
bc60: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
bc70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
bc80: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
bc90: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
bca0: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
bcb0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
bcc0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
bcd0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
bce0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
bcf0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
bd00: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
bd10: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
bd20: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bd30: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
bd40: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
bd50: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
bd60: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
bd70: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
bd80: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
bd90: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
bda0: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
bdb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bdc0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
bdd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bde0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
bdf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
be00: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
be10: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
be20: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
be30: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
be40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
be50: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
be60: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
be70: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
be80: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
be90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bea0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
beb0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
bec0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
bed0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
bee0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
bef0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bf00: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
bf10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bf20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bf30: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
bf40: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
bf50: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
bf60: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
bf70: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
bf80: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bf90: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
bfa0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
bfb0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bfc0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bfd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bfe0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bff0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
c000: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
c010: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
c020: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c030: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c040: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
c050: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c060: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c070: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c080: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c090: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
c0a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c0b0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c0c0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
c0d0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
c0e0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
c0f0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
c100: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
c110: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
c120: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
c130: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
c140: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
c150: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
c160: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
c170: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
c180: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
c190: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
c1a0: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
c1b0: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
c1c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1d0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
c1e0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
c1f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
c200: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
c210: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
c220: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
c230: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
c240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
c250: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
c260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c270: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
c280: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
c290: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
c2a0: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
c2b0: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
c2c0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
c2d0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
c2e0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
c2f0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
c300: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
c310: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c320: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c330: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
c340: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c350: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
c360: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
c370: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
c380: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c390: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
c3a0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
c3b0: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
c3c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
c3d0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
c3e0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
c3f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c400: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
c410: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
c420: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
c430: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
c440: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
c450: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c460: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c470: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
c480: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c490: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
c4a0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
c4b0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
c4c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
c4d0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
c4e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c4f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
c500: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
c510: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c520: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c530: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c540: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c550: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c560: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c570: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c580: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c590: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c5a0: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c5b0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c5c0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c5d0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c5e0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c5f0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c600: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c610: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c620: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c630: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c640: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c650: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c660: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c670: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c680: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c690: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c6a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c6b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c6c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c6d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c6e0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c6f0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c700: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c720: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c730: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c740: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c750: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c760: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c770: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c780: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c790: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c7a0: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c7b0: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c7c0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c7d0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c7e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c7f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c800: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c810: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c820: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c830: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c840: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c850: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c860: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c870: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c880: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c890: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c8a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c8b0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c8c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c8d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c8e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c8f0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c900: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c910: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c920: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c930: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c940: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c950: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c960: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c970: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c980: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c990: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c9a0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c9b0: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c9c0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c9d0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c9e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c9f0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
ca00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
ca10: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
ca20: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
ca30: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
ca40: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
ca50: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
ca60: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
ca70: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ca80: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
ca90: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
caa0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
cab0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
cac0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
cad0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
cae0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
caf0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
cb00: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
cb10: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
cb20: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
cb30: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
cb40: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
cb50: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
cb60: 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  fn);.    if( p->
cb70: 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65 6c  pWin ) gatherSel
cb80: 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29  ectWindows(pNew)
cb90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  ;.#endif.    pNe
cba0: 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65  w->selId = p->se
cbb0: 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  lId;.    *pp = p
cbc0: 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70  New;.    pp = &p
cbd0: 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  New->pPrior;.   
cbe0: 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20   pNext = pNew;. 
cbf0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
cc00: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  t;.}.#else.Selec
cc10: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
cc20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
cc30: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
cc40: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
cc50: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
cc60: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
cc70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
cc80: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
cc90: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
cca0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
ccb0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
ccc0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
ccd0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
cce0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
ccf0: 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72  .** The pList ar
cd00: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  gument must be e
cd10: 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
cd20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78  pointer to an Ex
cd30: 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e  prList.** obtain
cd40: 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  ed from a prior 
cd50: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
cd60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  xprListAppend().
cd70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
cd80: 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  * may not be use
cd90: 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69  d with an ExprLi
cda0: 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  st obtained from
cdb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cdc0: 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e  Dup()..** Reason
cdd0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
cde0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
cdf0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
ce00: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a   in pList->a[].*
ce10: 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  * is a power of 
ce20: 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72  two.  That is tr
ce30: 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78  ue for sqlite3Ex
ce40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  prListAppend() r
ce50: 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73  eturns.** but is
ce60: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
ce70: 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72   true from the r
ce80: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
ce90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cea0: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  p()..**.** If a 
ceb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
cec0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
ced0: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
cee0: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
cef0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
cf00: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
cf10: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
cf20: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
cf30: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
cf40: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
cf50: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
cf60: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
cf70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cf80: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
cf90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
cfa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cfb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
cfc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cfd0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
cfe0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
cff0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d000: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
d010: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d020: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
d030: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
d040: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ULL */.){.  stru
d050: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d060: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
d070: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d080: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
d090: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
d0a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
d0b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
d0c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
d0d0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
d0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
d100: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
d110: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
d120: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
d130: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
d140: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
d150: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  1))==0 ){.    Ex
d160: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
d170: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
d180: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
d190: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
d1a0: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
d1b0: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  )+(2*pList->nExp
d1c0: 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c  r - 1)*sizeof(pL
d1d0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
d1e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
d1f0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
d200: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
d210: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
d220: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d230: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
d240: 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  +];.  assert( of
d250: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d260: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d  prList_item,zNam
d270: 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d  e)==sizeof(pItem
d280: 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73  ->pExpr) );.  as
d290: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d2a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d2b0: 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b  tem,pExpr)==0 );
d2c0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d  .  memset(&pItem
d2d0: 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66  ->zName,0,sizeof
d2e0: 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f  (*pItem)-offseto
d2f0: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d300: 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a  t_item,zName));.
d310: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
d320: 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e   pExpr;.  return
d330: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
d340: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
d350: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
d360: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
d370: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
d380: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d390: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
d3a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d3b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  (db, pList);.  r
d3c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d3d0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70  * pColumns and p
d3e0: 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74  Expr form a vect
d3f0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68  or assignment wh
d400: 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74  ich is part of t
d410: 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65  he SET.** clause
d420: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
d430: 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74  atement.  Like t
d440: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
d450: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70    (a,b,c) = (exp
d460: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
d470: 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63  ** Or:    (a,b,c
d480: 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c  ) = (SELECT x,y,
d490: 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a  z FROM ....).**.
d4a0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  ** For each term
d4b0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 61   of the vector a
d4c0: 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e  ssignment, appen
d4d0: 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f  d new entries to
d4e0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
d4f0: 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20  on list pList.  
d500: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  In the case of a
d510: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d520: 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20   RHS, append.** 
d530: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
d540: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f   expressions..*/
d550: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
d560: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d570: 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20  Vector(.  Parse 
d580: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d590: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d5a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d5b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
d5c0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d5d0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
d5e0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49  t be NULL */.  I
d5f0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
d600: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
d610: 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66   names of LHS of
d620: 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20   the assignment 
d630: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
d640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d650: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
d660: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d670: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d680: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d690: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d6a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
d6b0: 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  i;.  int iFirst 
d6c0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
d6d0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a  >nExpr : 0;.  /*
d6e0: 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e   pColumns can on
d6f0: 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74  ly be NULL due t
d700: 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20  o an OOM but an 
d710: 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61  OOM will cause a
d720: 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f  n.  ** exit prio
d730: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
d740: 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  e being invoked 
d750: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
d760: 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f  Columns==0) ) go
d770: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d780: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
d790: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
d7a0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d7b0: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  r;..  /* If the 
d7c0: 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c  RHS is a vector,
d7d0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d   then we can imm
d7e0: 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74  ediately check t
d7f0: 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a  o see that .  **
d800: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d810: 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74   RHS and LHS mat
d820: 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  ch.  But if the 
d830: 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c  RHS is a SELECT,
d840: 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73   .  ** wildcards
d850: 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65   ("*") in the re
d860: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d870: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65  SELECT must be e
d880: 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20  xpanded before. 
d890: 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68   ** we can do th
d8a0: 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f  e size check, so
d8b0: 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65 20   defer the size 
d8c0: 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65  check until code
d8d0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a   generation..  *
d8e0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
d8f0: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p!=TK_SELECT && 
d900: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28  pColumns->nId!=(
d910: 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n=sqlite3ExprVec
d920: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29 20  torSize(pExpr)) 
d930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d940: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d950: 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
d960: 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49      pColumns->nI
d990: 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  d, n);.    goto 
d9a0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d9b0: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ror;.  }..  for(
d9c0: 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d  i=0; i<pColumns-
d9d0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
d9e0: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
d9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
da00: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
da10: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
da20: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
da30: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
da40: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
da50: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
da60: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
da70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
da80: 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b  nExpr==iFirst+i+
da90: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
daa0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
dab0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c  -1].zName = pCol
dac0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
dad0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73  ;.      pColumns
dae0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
daf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
db00: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
db10: 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f  iled && pExpr->o
db20: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
db30: 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29  ALWAYS(pList!=0)
db40: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46   ){.    Expr *pF
db50: 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  irst = pList->a[
db60: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20  iFirst].pExpr;. 
db70: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
db80: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
db90: 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d  rt( pFirst->op==
dba0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
dbb0: 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a   );.     .    /*
dbc0: 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43   Store the SELEC
dbd0: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70  T statement in p
dbe0: 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c  Right so it will
dbf0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
dc00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
dc10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20  xprListDelete() 
dc20: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  is called */.   
dc30: 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20   pFirst->pRight 
dc40: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78  = pExpr;.    pEx
dc50: 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  pr = 0;..    /* 
dc60: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
dc70: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
dc80: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
dc90: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
dcb0: 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61  and LHS sizes ma
dcc0: 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20  tch during code 
dcd0: 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  generation. */. 
dce0: 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c     pFirst->iTabl
dcf0: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  e = pColumns->nI
dd00: 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61  d;.  }..vector_a
dd10: 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73  ppend_error:.  s
dd20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
dd30: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
dd40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
dd50: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
dd60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
dd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dd80: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
dd90: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
dda0: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
ddb0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
ddc0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
ddd0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
dde0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
ddf0: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
de00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
de10: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
de20: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
de30: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
de40: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
de50: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
de60: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
de70: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
de80: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
de90: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
dea0: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
deb0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
dec0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
ded0: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
dee0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
def0: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
df00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
df10: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
df20: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
df30: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
df40: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
df50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
df60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
df70: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
df80: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
df90: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
dfa0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
dfb0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
dfc0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
dfd0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
dfe0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
dff0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e000: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e010: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e020: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
e030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e040: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e060: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e070: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e080: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e090: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
e0a0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
e0b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
e0c0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
e0d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
e0e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e0f0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
e100: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
e110: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
e120: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
e130: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e140: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e150: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e160: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e170: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
e180: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e190: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
e1a0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e1b0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e1c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
e1d0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
e1e0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
e1f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
e200: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
e210: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
e220: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
e230: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
e240: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
e250: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
e260: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
e270: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
e280: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
e290: 2c 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e  , (void*)pItem->
e2a0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
e2b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e2c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e2d0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
e2e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e2f0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e300: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e310: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e320: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e330: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e340: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e350: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
e360: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e370: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e380: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e390: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e3a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e3b0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e3c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e3d0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
e3e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e3f0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e400: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e410: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e420: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e430: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e440: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e460: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
e470: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
e480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e490: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
e4a0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
e4b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e4c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e4e0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
e4f0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
e500: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e510: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e520: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e530: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e540: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
e550: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
e560: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
e570: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e580: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e590: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
e5a0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e5b0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e5c0: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e5d0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e5e0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e5f0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e600: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e610: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e620: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e630: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e650: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e670: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e680: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e690: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e6a0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e6b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e6c0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e6d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e6e0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e6f0: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e700: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e710: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e720: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e730: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e740: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e770: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e780: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e790: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e7a0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e7b0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e7c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e7d0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e7e0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e7f0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e800: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e810: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e820: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e830: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e840: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e850: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e860: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e880: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e890: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e8a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e8b0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e8c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e8d0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e8e0: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e8f0: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e910: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e930: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e940: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e950: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e960: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e970: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e980: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e990: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e9a0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e9b0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e9c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e9d0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e9e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
e9f0: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
ea00: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
ea10: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
ea20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
ea30: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
ea40: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
ea50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
ea60: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
ea70: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
ea80: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ea90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
eaa0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
eab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
eac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
ead0: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
eae0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
eaf0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
eb00: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
eb10: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
eb20: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
eb30: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
eb40: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
eb50: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
eb60: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
eb70: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
eb80: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
eb90: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
eba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
ebb0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
ebc0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
ebd0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ebe0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ebf0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ec00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ec10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ec20: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
ec30: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
ec40: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
ec50: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
ec60: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
ec70: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
ec80: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
ec90: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
eca0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ecb0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
ecc0: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
ecd0: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
ece0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
ecf0: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
ed00: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
ed10: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
ed20: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
ed30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
ed40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ed50: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
ed60: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ed70: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
ed80: 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  , "true")==0.   
ed90: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
eda0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
edb0: 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20  n, "false")==0. 
edc0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
edd0: 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  p = TK_TRUEFALSE
ede0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
edf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ee00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
ee10: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
ee20: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70  TK_TRUEFALSE Exp
ee30: 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  r node.  Return 
ee40: 31 20 69 66 20 69 74 20 69 73 20 54 52 55 45 0a  1 if it is TRUE.
ee50: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
ee60: 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20  s FALSE..*/.int 
ee70: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
ee80: 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72  Value(const Expr
ee90: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
eea0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
eeb0: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20  K_TRUEFALSE );. 
eec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eed0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
eee0: 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d  .zToken,"true")=
eef0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
ef00: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
ef10: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c  r->u.zToken,"fal
ef20: 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  se")==0 );.  ret
ef30: 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  urn pExpr->u.zTo
ef40: 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  ken[4]==0;.}.../
ef50: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
ef60: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
ef70: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
ef80: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
ef90: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
efa0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
efb0: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
efc0: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
efd0: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
efe0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
eff0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
f000: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
f010: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
f020: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
f030: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
f040: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
f050: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
f060: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
f070: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f080: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f0a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
f0b0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f0c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
f0d0: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
f0e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f0f0: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
f100: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
f110: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f120: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f130: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
f140: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f150: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
f160: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f170: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
f180: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
f190: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
f1a0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
f1b0: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
f1c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
f1d0: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
f1e0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
f1f0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
f200: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f210: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
f220: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
f230: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
f240: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
f250: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
f260: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
f270: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
f280: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
f290: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
f2a0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
f2b0: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
f2c0: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
f2d0: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
f2e0: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
f2f0: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
f300: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
f310: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
f320: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
f330: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
f340: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
f350: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
f360: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
f370: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
f380: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
f390: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
f3a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
f3b0: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
f3c0: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
f3d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
f3e0: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
f3f0: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
f400: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
f410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
f420: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
f430: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
f440: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
f450: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
f460: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
f470: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
f480: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
f490: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
f4a0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
f4b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
f4c0: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
f4d0: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
f4e0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
f4f0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
f500: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
f510: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f520: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
f530: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f540: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
f550: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f560: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
f570: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
f580: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
f590: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
f5a0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
f5b0: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
f5c0: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
f5d0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
f5e0: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
f5f0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
f600: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
f610: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
f620: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
f630: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
f640: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
f650: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
f660: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f670: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
f680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f690: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
f6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f6b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f6c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f6d0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f6e0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f6f0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f700: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f710: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
f720: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74     /* Convert "t
f730: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20  rue" or "false" 
f740: 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  in a DEFAULT cla
f750: 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  use into the.   
f760: 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74     ** appropriat
f770: 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f  e TK_TRUEFALSE o
f780: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f790: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f7a0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
f7b0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f7c0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
f7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7e0: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
f7f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f800: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
f810: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
f820: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f830: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
f840: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f850: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
f860: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f870: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f880: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f8a0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
f8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f8c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f8d0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f8e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f8f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f900: 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61  FixedCol) && pWa
f910: 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29  lker->eCode!=2 )
f920: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f930: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f950: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f960: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f970: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f980: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f990: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f9a0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f9b0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f9c0: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f9d0: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f9e0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f9f0: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
fa00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fa10: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
fa20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fa30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
fa40: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
fa50: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fa60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
fa70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
fa80: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
fa90: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
faa0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
fab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
fac0: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
fad0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
fae0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
faf0: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
fb00: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
fb10: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
fb20: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
fb30: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fb40: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
fb50: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
fb60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fb70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
fb80: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
fb90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fba0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
fbb0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
fbc0: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
fbd0: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
fbe0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
fbf0: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
fc00: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
fc10: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
fc20: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
fc30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
fc40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
fc50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fc60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fc70: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
fc80: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
fc90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fca0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
fcb0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
fcc0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fcd0: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fce0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fcf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fd00: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
fd10: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fd20: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fd30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
fd40: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
fd50: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
fd60: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
fd70: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
fd80: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
fd90: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
fda0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
fdb0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
fdc0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
fdd0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
fde0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
fdf0: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
fe00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fe10: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
fe20: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
fe30: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
fe40: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
fe50: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
fe60: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fe70: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fe80: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fe90: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fea0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
feb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fec0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fed0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fee0: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
fef0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ff00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ff10: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
ff20: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
ff30: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
ff40: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
ff50: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
ff60: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
ff70: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
ff80: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
ff90: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
ffa0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
ffb0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
ffc0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ffd0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
ffe0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fff0: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
10000 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
10010 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
10020 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
10030 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20  **.**   (1) the 
10040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10050 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20  nstant, and.**  
10060 20 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73   (2) the express
10070 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61  ion does origina
10080 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  te in the ON or 
10090 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
100a0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
100b0 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  JOIN, and.**   (
100c0 33 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  3) the expressio
100d0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
100e0 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43  in any EP_FixedC
100f0 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  ol TK_COLUMN.** 
10100 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63        operands c
10110 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
10120 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
10130 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
10140 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
10150 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10160 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61   true, it indica
10170 74 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70  tes that the exp
10180 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ression.** can b
10190 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
101a0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
101b0 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75  r list and evalu
101c0 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a  ated once when.*
101d0 2a 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  * the prepared s
101e0 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20  tatement starts 
101f0 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  up.  See sqlite3
10200 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29  ExprCodeAtInit()
10210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10220 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
10230 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
10240 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10250 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
10260 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10270 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10280 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10290 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
102a0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
102b0 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
102c0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
102d0 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
102e0 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
102f0 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
10300 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
10310 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
10320 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
10330 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
10340 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
10350 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
10360 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
10370 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
10380 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
10390 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
103a0 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
103b0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
103c0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
103d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
103e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
103f0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
10400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10410 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10420 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
10430 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
10440 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
10450 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
10460 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
10470 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
10480 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
10490 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
104a0 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
104b0 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
104c0 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
104d0 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
104e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
104f0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
10500 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
10510 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
10520 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
10530 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10540 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
10550 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
10560 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
10570 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
10580 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
10590 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
105a0 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  ( sqlite3IsBinar
105b0 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  y(pColl) ){.    
105c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
105d0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
105e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
105f0 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10600 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
10610 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
10620 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
10630 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10640 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
10650 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
10660 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
10670 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
10680 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
10690 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
106a0 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
106b0 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
106c0 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
106d0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
106e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
106f0 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
10700 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
10710 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10720 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
10730 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
10740 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
10750 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
10760 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
10770 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
10780 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
10790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
107a0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
107b0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
107c0 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
107d0 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
107e0 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
107f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10800 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
10810 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
10820 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
10830 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
10840 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
10850 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
10860 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
10870 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
10880 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
10890 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
108a0 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
108b0 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
108c0 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
108d0 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
108e0 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
108f0 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
10900 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
10910 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
10920 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
10930 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
10940 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
10950 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
10960 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
10970 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
10980 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
10990 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
109a0 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
109b0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
109c0 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
109d0 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
109e0 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
109f0 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
10a00 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10a10 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10a20 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
10a30 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
10a40 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
10a50 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
10a60 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
10a70 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
10a80 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
10a90 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
10aa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10ab0 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10ac0 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10ad0 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10ae0 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
10af0 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
10b00 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10b10 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10b20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10b30 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
10b40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10b50 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
10b60 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
10b70 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
10b80 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
10b90 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
10ba0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10bb0 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10bc0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10bd0 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10be0 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
10bf0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
10c00 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10c10 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10c20 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
10c30 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10c40 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10c50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10c60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10c70 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
10c80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
10c90 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
10ca0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10cb0 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10cc0 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10cd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10ce0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10d00 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10d10 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10d20 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10d30 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10d40 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
10d50 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
10d60 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
10d70 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
10d80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10d90 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
10da0 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10db0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10dc0 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10dd0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10de0 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
10df0 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
10e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e10 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
10e20 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10e30 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10e40 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
10e50 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
10e60 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
10e70 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
10e80 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
10e90 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
10ea0 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10eb0 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10ec0 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10ed0 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10ee0 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
10ef0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10f00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
10f10 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
10f20 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
10f30 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10f40 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
10f50 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
10f60 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
10f70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
10f80 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
10f90 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
10fa0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10fb0 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10fc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10fd0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10fe0 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
10ff0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
11000 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
11010 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
11020 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
11030 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
11040 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
11050 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
11060 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
11070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11080 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
11090 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
110a0 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
110b0 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
110c0 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
110d0 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
110e0 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
110f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11100 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
11110 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
11120 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
11130 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
11140 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
11150 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
11160 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
11170 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
11180 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
11190 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
111a0 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
111b0 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
111c0 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
111d0 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
111e0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
111f0 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
11200 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
11210 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
11220 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
11230 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
11240 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
11250 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
11260 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
11270 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
11280 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
11290 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
112a0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
112b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
112c0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
112d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
112e0 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
112f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11300 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
11310 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
11320 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11330 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
11340 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
11350 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11360 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
11370 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
11380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
11390 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
113a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
113b0 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
113c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
113d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
113e0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
113f0 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
11400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11410 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
11420 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11430 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
11440 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
11450 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
11460 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11470 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
11480 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11490 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
114a0 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
114b0 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
114c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
114d0 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
114e0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
114f0 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
11500 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
11510 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
11520 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
11530 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
11540 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
11550 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
11560 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
11570 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
11580 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
11590 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
115a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
115b0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
115c0 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
115d0 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
115e0 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
115f0 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
11600 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
11610 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
11620 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
11630 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
11640 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
11650 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
11660 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
11670 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
11680 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11690 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
116a0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
116b0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
116c0 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
116d0 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
116e0 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
116f0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11700 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11710 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11720 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11730 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11740 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11750 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
11760 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
11770 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
11780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
11790 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
117a0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
117b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
117c0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
117e0 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  y.pTab==0 ||  /*
117f0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
11800 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
11810 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11820 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
11830 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
11840 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  >y.pTab->aCol[p-
11850 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
11860 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
11870 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11880 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11890 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
118a0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
118b0 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
118c0 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
118d0 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
118e0 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
118f0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
11900 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
11910 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
11920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11930 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
11940 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11950 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
11960 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
11970 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
11980 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
11990 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
119a0 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
119b0 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
119c0 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
119d0 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
119e0 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
119f0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
11a00 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
11a10 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
11a20 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
11a30 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
11a40 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
11a50 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
11a60 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
11a70 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
11a80 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
11a90 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
11aa0 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
11ab0 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11ac0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11ad0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
11ae0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11af0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11b00 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11b10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11b20 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
11b30 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11b40 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11b50 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
11b60 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11b70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
11b80 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11b90 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11ba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
11bb0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
11bc0 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
11bd0 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
11be0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
11bf0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
11c00 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
11c10 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
11c20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11c30 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
11c40 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
11c50 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
11c60 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
11c70 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
11c80 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
11c90 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
11ca0 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
11cb0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11cc0 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
11cd0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11cf0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11d00 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11d10 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
11d20 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
11d30 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
11d40 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
11d50 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
11d60 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
11d70 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
11d80 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
11d90 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11da0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
11db0 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
11dc0 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11dd0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
11de0 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
11e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11e10 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 69  ABLE_NORMALIZE.i
11e20 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
11e30 64 4e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  dN(const char *z
11e40 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20  , int n){.  if( 
11e50 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11e60 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 2c 20 6e 29  z, "_ROWID_", n)
11e70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11e90 4e 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  NICmp(z, "ROWID"
11ea0 2c 20 6e 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  , n)==0 ) return
11eb0 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11ec0 33 53 74 72 4e 49 43 6d 70 28 7a 2c 20 22 4f 49  3StrNICmp(z, "OI
11ed0 44 22 2c 20 6e 29 3d 3d 30 20 29 20 72 65 74 75  D", n)==0 ) retu
11ee0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
11ef0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11f00 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
11f10 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
11f20 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
11f30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11f40 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
11f50 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
11f60 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
11f70 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
11f80 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
11f90 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11fa0 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
11fb0 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
11fc0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
11fd0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
11fe0 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
11ff0 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
12000 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
12010 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
12020 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
12030 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12040 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
12050 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
12060 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
12070 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
12080 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
12090 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
120a0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
120b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
120c0 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
120d0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
120e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
120f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
12100 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
12110 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
12120 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
12130 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
12140 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
12150 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
12160 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
12170 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
12180 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12190 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
121a0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
121b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
121c0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
121d0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
121e0 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
121f0 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
12200 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
12210 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
12220 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
12230 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
12240 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12250 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12260 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
12270 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
12280 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
12290 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
122a0 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
122b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
122c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
122d0 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
122f0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
12300 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
12310 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
12320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12330 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
12340 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
12350 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
12360 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
12370 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
12380 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
12390 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
123a0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
123b0 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
123c0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
123d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
123e0 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
123f0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
12400 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
12410 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
12420 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
12430 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
12440 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
12450 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
12460 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
12470 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
12480 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
12490 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
124a0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
124b0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
124c0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
124d0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
124e0 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
124f0 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
12500 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12510 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
12520 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
12530 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
12540 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72   /* All SELECT r
12550 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63  esults must be c
12560 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72  olumns. */.  for
12570 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
12580 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12590 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45   Expr *pRes = pE
125a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
125b0 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  ;.    if( pRes->
125c0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
125d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73  return 0;.    as
125e0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
125f0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
12600 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
12610 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
12620 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
12630 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e   return p;.}.#en
12640 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12650 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
12660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12670 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
12680 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12690 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65   that checks the
126a0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
126b0 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65  n of index table
126c0 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a   iCur to see if.
126d0 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  ** it contains a
126e0 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e  ny NULL entries.
126f0 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69    Cause the regi
12700 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75  ster at regHasNu
12710 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20  ll to be set.** 
12720 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  to a non-NULL va
12730 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74  lue if iCur cont
12740 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20  ains no NULLs.  
12750 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72  Cause register r
12760 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  egHasNull.** to 
12770 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
12780 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
12790 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
127a0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
127b0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
127c0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64  etHasNullFlag(Vd
127d0 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c  be *v, int iCur,
127e0 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29   int regHasNull)
127f0 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  {.  int addr1;. 
12800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12810 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12820 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
12830 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12840 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12850 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
12860 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12870 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
12880 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
12890 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72  lumn, iCur, 0, r
128a0 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71  egHasNull);.  sq
128b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
128c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45  5(v, OPFLAG_TYPE
128d0 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f  OFARG);.  VdbeCo
128e0 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74  mment((v, "first
128f0 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20  _entry_in(%d)", 
12900 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  iCur));.  sqlite
12910 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12920 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69   addr1);.}.#endi
12930 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
12940 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12950 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
12960 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ent is an IN ope
12970 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73  rator with a lis
12980 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
12990 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69  y) on the .** ri
129a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20  ght-hand side.  
129b0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
129c0 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73  hat list is cons
129d0 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tant..*/.static 
129e0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73  int sqlite3InRhs
129f0 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
12a00 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  *pIn){.  Expr *p
12a10 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  LHS;.  int res;.
12a20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
12a30 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20  asProperty(pIn, 
12a40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
12a50 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70  .  pLHS = pIn->p
12a60 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  Left;.  pIn->pLe
12a70 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20  ft = 0;.  res = 
12a80 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12a90 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49  stant(pIn);.  pI
12aa0 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b  n->pLeft = pLHS;
12ab0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12ac0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12ae0 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
12af0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
12b00 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
12b10 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
12b20 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
12b30 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
12b40 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12b50 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
12b60 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
12b70 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
12b80 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
12b90 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
12ba0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
12bb0 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
12bc0 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
12bd0 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
12be0 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
12bf0 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
12c00 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
12c10 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
12c20 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
12c30 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
12c40 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
12c50 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
12c60 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
12c70 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
12c80 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
12c90 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20  ect that is the 
12ca0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12cb0 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58  erator.** and pX
12cc0 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  ->iTable is set 
12cd0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
12ce0 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  that cursor..**.
12cf0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
12d00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
12d10 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
12d20 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
12d30 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12d40 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
12d50 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20  OWID      - The 
12d60 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
12d70 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
12d80 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12d90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20  NDEX_INDEX_ASC  
12da0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12db0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73   opened on an as
12dc0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
12dd0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12de0 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75  EX_DESC - The cu
12df0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12e00 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
12e10 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
12e20 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20  NDEX_EPH        
12e30 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12e40 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
12e50 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
12e60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
12e80 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
12e90 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  l table..**   IN
12ea0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20  _INDEX_NOOP     
12eb0 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61    - No cursor wa
12ec0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68  s allocated.  Th
12ed0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  e IN operator mu
12ee0 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  st be.**        
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
12f10 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  a sequence of co
12f20 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  mparisons..**.**
12f30 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
12f40 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65  ree might be use
12f50 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70  d if the RHS exp
12f60 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20  ression pX is a 
12f70 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65  simple.** subque
12f80 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a  ry such as:.**.*
12f90 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
12fa0 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32  lumn1>, <column2
12fb0 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  >... FROM <table
12fc0 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
12fd0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12fe0 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
12ff0 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
13000 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
13010 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
13020 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
13030 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
13040 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
13050 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
13060 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
13070 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
13080 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
13090 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
130a0 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
130b0 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
130c0 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
130d0 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d  tain, at a minim
130e0 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  um, one of the b
130f0 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
13100 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
13110 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20  _INDEX_LOOP but 
13120 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e  not both.  If in
13130 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
13140 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
13150 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
13160 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
13170 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
13180 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65   a fast.** membe
13190 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
131a0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
131b0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
131c0 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c  the IN index wil
131d0 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  l.** be used to 
131e0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
131f0 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
13200 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13210 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  or..**.** When I
13220 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20  N_INDEX_LOOP is 
13230 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
13240 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
13250 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
13260 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
13270 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68  members) then th
13280 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f  e b-tree must no
13290 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63  t contain duplic
132a0 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65  ates..** An ephe
132b0 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  remal table will
132c0 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65   be created unle
132d0 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
132e0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
132f0 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
13300 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
13310 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
13320 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13330 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
13340 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
13350 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
13360 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
13370 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
13380 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
13390 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
133a0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
133b0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
133c0 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
133d0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
133e0 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
133f0 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
13400 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
13410 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
13420 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
13430 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
13440 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
13450 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
13460 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
13470 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
13480 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
13490 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
134a0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
134b0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
134c0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
134d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
134e0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
134f0 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
13500 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
13510 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
13520 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
13530 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
13540 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
13550 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
13560 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
13570 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
13580 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
13590 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
135a0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
135b0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
135c0 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
135d0 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
135e0 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
135f0 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
13600 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
13610 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
13620 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
13630 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
13640 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
13650 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
13660 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
13670 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
13680 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13690 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
136a0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
136b0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
136c0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
136d0 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
136e0 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
136f0 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
13700 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
13710 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
13720 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
13730 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
13740 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
13750 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
13760 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
13770 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
13780 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
13790 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
137a0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
137b0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
137c0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
137d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
137e0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
137f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
13800 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
13810 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
13820 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
13830 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
13840 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
13850 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
13860 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
13870 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
13880 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
13890 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
138a0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
138b0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
138c0 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
138d0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
138e0 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
138f0 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
13900 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
13910 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
13920 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
13930 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
13940 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
13950 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13960 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
13970 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
13980 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
13990 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
139a0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
139b0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
139c0 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
139d0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
139e0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
139f0 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
13a00 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
13a10 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
13a20 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
13a30 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
13a40 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
13a50 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
13a60 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
13a70 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
13a80 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
13a90 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
13aa0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
13ab0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
13ac0 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
13ad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ae0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
13af0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
13b00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
13b10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
13b20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13b30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
13b40 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pX,             
13b50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
13b60 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
13b70 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  ) of the IN oper
13b80 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e  ator */.  u32 in
13b90 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
13ba0 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58       /* IN_INDEX
13bb0 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48  _LOOP, _MEMBERSH
13bc0 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50  IP, and/or _NOOP
13bd0 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72  _OK */.  int *pr
13be0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20  RhsHasNull,     
13bf0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
13c00 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61  holding NULL sta
13c10 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20  tus.  See notes 
13c20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
13c50 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20  Index fields to 
13c60 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  RHS fields */.){
13c70 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
13ca0 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
13cb0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
13cc0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
13cd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
13cf0 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
13d00 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
13d10 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
13d20 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
13d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13d40 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
13d50 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
13d60 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13d80 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
13d90 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
13da0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
13db0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13dc0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
13dd0 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
13de0 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
13df0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
13e00 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
13e10 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
13e20 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
13e30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52  ;..  /* If the R
13e40 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e  HS of this IN(..
13e50 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  .) operator is a
13e60 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20   SELECT, and if 
13e70 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a  it matters .  **
13e80 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13e90 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
13ea0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  t contains NULL 
13eb0 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68  values, check wh
13ec0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
13ed0 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c  t NULL is actual
13ee0 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20  ly possible (it 
13ef0 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20  may not be, for 
13f00 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20  example, due .  
13f10 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63  ** to NOT NULL c
13f20 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
13f30 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f  e schema). If no
13f40 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
13f50 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20   possible,.  ** 
13f60 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  set prRhsHasNull
13f70 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e   to 0 before con
13f80 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69  tinuing.  */.  i
13f90 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
13fa0 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20  && (pX->flags & 
13fb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
13fc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13fd0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
13fe0 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
13ff0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
14000 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
14010 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14020 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14030 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c  xprCanBeNull(pEL
14040 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14050 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14060 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73      if( i==pELis
14070 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
14080 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d    prRhsHasNull =
14090 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
140a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
140b0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
140c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
140d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
140e0 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
140f0 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
14100 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
14110 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
14120 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
14130 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
14140 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26  Parse->nErr==0 &
14150 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61  & (p = isCandida
14160 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21  teForInOpt(pX))!
14170 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14180 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14190 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
141a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
141b0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
141c0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
141f0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
14200 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  16 iDb;         
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14230 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
14240 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
14250 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
14260 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  st;.    int nExp
14270 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
14280 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
14290 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
142a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
142b0 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
142c0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
142d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
142e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
142f0 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
14300 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14310 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14320 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14330 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
14340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14350 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14360 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14370 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
14380 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
14390 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20  b;..    /* Code 
143a0 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
143b0 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
143c0 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
143d0 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
143e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
143f0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
14400 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
14410 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
14420 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
14430 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
14440 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
14450 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
14460 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
14470 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20      assert(v);  
14480 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  /* sqlite3GetVdb
14490 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62  e() has always b
144a0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
144b0 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  alled */.    if(
144c0 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c   nExpr==1 && pEL
144d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
144e0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
144f0 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e      /* The "x IN
14500 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   (SELECT rowid F
14510 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65  ROM table)" case
14520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
14530 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14540 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
14550 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ce);.      VdbeC
14560 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
14570 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
14580 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
14590 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
145a0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
145b0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
145c0 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 45  X_ROWID;.      E
145d0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
145e0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
145f0 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 52          "USING R
14600 4f 57 49 44 20 53 45 41 52 43 48 20 4f 4e 20 54  OWID SEARCH ON T
14610 41 42 4c 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f  ABLE %s FOR IN-O
14620 50 45 52 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a  PERATOR",pTab->z
14630 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
14640 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14650 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
14660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
14670 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
146a0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
146b0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
146c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
146d0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
146e0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
146f0 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
14700 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
14710 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
14720 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
14730 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
14740 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
14750 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
14760 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
14770 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
14780 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
14790 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
147a0 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
147b0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
147c0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
147d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
147e0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
147f0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
14800 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
14810 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
14820 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
14830 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
14840 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
14850 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
14860 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
14870 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
14880 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
14890 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
148a0 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
148b0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
148c0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
148d0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
148e0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
148f0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
14900 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14910 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14920 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
14930 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
14940 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
14950 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
14960 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
14970 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
14980 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
14990 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
149a0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
149b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
149c0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
149d0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
149e0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
149f0 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
14a00 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
14a10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
14a20 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
14a30 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
14a40 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
14a50 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
14a60 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
14a70 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
14a80 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
14a90 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
14aa0 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
14ab0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
14ac0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
14ad0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
14ae0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
14af0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14b00 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
14b10 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
14b20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14b30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
14b40 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
14b50 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
14b60 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
14b70 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
14b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14b90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
14ba0 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
14bb0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
14bc0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
14bd0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
14be0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
14bf0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14c00 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
14c10 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
14c20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
14c30 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14c40 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14c50 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
14c60 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
14c70 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
14c80 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14c90 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
14ca0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
14cb0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
14cc0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
14cd0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
14ce0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
14cf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
14d00 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
14d10 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e!=0 ) continue;
14d20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
14d30 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73  ximum nColumn is
14d40 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d   BMS-2, not BMS-
14d50 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  1, so that we ca
14d60 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20  n compute.      
14d70 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e      ** BITMASK(n
14d80 45 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76  Expr) without ov
14d90 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20  erflowing */.   
14da0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14db0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
14dc0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20  BMS-2 );.       
14dd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
14de0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
14df0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1 );.          i
14e00 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14e10 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e  >=BMS-1 ) contin
14e20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
14e30 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29  ( mustBeUnique )
14e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
14e50 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  ( pIdx->nKeyCol>
14e60 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  nExpr.          
14e70 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c     ||(pIdx->nCol
14e80 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73  umn>nExpr && !Is
14e90 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
14ea0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  )).            )
14eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14ec0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68  continue;  /* Th
14ed0 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
14ee0 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20  unique over the 
14ef0 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a  IN RHS columns *
14f00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  /.            }.
14f10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
14f20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
14f30 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d   = 0;   /* Colum
14f40 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64  ns of index used
14f50 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
14f60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14f70 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14f80 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
14f90 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
14fa0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
14fb0 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
14fc0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
14fd0 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRhs = pEList->
14fe0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14ff0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
15000 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
15010 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
15020 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
15030 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
15040 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20       int j;.  . 
15050 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
15060 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52  t( pReq!=0 || pR
15070 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
15080 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d  ROWID || pParse-
15090 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
150a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
150b0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
150c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
150d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
150e0 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
150f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15100 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15110 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
15120 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
15130 20 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26     if( pReq!=0 &
15140 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
15150 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49  (pReq->zName, pI
15160 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  dx->azColl[j])!=
15170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15180 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
151b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
151c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
151d0 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65  ( j==nExpr ) bre
151e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
151f0 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a  mCol = MASKBIT(j
15200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15210 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65  f( mCol & colUse
15220 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61  d ) break; /* Ea
15230 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f  ch column used o
15240 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20  nly once */.    
15250 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
15260 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20  |= mCol;.       
15270 20 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29       if( aiMap )
15280 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20   aiMap[i] = j;. 
15290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
152a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
152b0 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55  i==nExpr || colU
152c0 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed!=(MASKBIT(nE
152d0 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20  xpr)-1) );.     
152e0 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64       if( colUsed
152f0 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  ==(MASKBIT(nExpr
15300 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )-1) ){.        
15310 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
15320 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
15330 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e  hat means the in
15340 64 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62  dex pIdx is usab
15350 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
15360 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
15370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
15380 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
15390 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
153a0 20 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69            Explai
153b0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
153c0 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45       "USING INDE
153f0 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
15400 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
15410 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
15420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15430 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
15440 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
15450 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
15460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15470 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
15480 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
15490 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
154a0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
154b0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
154c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
154d0 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
154e0 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
154f0 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
15500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
15510 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
15520 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
15530 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
15540 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
15550 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15560 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
15570 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
15580 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
15590 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
155a0 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
155c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
155d0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
155e0 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
155f0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
15600 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
15610 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
15620 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
15630 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
15640 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15660 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15690 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
156a0 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
156c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
156d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
156e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
156f0 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
15700 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
15710 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
15720 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
15730 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
15740 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
15750 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
15760 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
15770 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
15780 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
15790 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
157a0 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
157b0 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
157c0 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
157d0 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
157e0 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
157f0 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
15800 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
15810 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
15820 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15830 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
15840 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
15850 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
15860 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
15870 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
15880 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
15890 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
158a0 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
158b0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
158c0 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
158d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
158e0 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
158f0 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
15900 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
15910 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
15920 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
15930 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
15940 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
15950 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
15960 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
15970 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
15980 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
15990 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
159a0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
159b0 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
159c0 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
159d0 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
159e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
159f0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
15a00 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
15a10 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
15a20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
15a30 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
15a40 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
15a50 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
15a60 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
15a70 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
15a80 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
15a90 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
15aa0 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
15ab0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
15ac0 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
15ad0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
15ae0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15af0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
15b00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
15b10 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
15b20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
15b30 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
15b40 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
15b50 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
15b60 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
15b70 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15b80 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
15b90 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
15ba0 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
15bb0 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
15bc0 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Mem;.    }.    s
15bd0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15be0 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
15bf0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
15c00 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
15c10 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
15c20 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
15c30 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
15c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
15c50 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
15c60 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70    }..  if( aiMap
15c70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15c80 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26  DEX_INDEX_ASC &&
15c90 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
15ca0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
15cb0 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
15cc0 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
15cd0 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70  VectorSize(pX->p
15ce0 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  Left);.    for(i
15cf0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69  =0; i<n; i++) ai
15d00 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a  Map[i] = i;.  }.
15d10 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
15d20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
15d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
15d40 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67  BQUERY./*.** Arg
15d50 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61  ument pExpr is a
15d60 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e  n (?, ?...) IN(.
15d70 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
15d80 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
15d90 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
15da0 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65  returns a nul-te
15db0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
15dc0 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
15dd0 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  he affinities to
15de0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63   be used for eac
15df0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
15e00 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
15e10 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
15e20 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15e30 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
15e40 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  re that the retu
15e50 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69  rned.** string i
15e60 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
15e70 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
15e80 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  DbFree()..*/.sta
15e90 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e  tic char *exprIN
15ea0 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
15eb0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15ec0 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  xpr){.  Expr *pL
15ed0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15ee0 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d  ft;.  int nVal =
15ef0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
15f00 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
15f10 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
15f20 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73   = (pExpr->flags
15f30 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
15f40 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   ? pExpr->x.pSel
15f50 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20  ect : 0;.  char 
15f60 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74  *zRet;..  assert
15f70 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15f80 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73  IN );.  zRet = s
15f90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
15fa0 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  w(pParse->db, nV
15fb0 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65  al+1);.  if( zRe
15fc0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
15fd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15fe0 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
15ff0 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69   Expr *pA = sqli
16000 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
16010 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
16020 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20  .      char a = 
16030 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
16040 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69  ity(pA);.      i
16050 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
16060 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
16070 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16080 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e  finity(pSelect->
16090 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
160a0 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65  pr, a);.      }e
160b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  lse{.        zRe
160c0 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20  t[i] = a;.      
160d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74  }.    }.    zRet
160e0 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nVal] = '\0';. 
160f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
16100 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
16110 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16120 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c  SUBQUERY./*.** L
16130 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  oad the Parse ob
16140 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
16150 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16160 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  t with an error 
16170 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74  .** message of t
16180 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
16190 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
161a0 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d  urns N columns -
161b0 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20   expected M".*/ 
161c0 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53    .void sqlite3S
161d0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61  ubselectError(Pa
161e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
161f0 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45   nActual, int nE
16200 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20  xpect){.  const 
16210 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75  char *zFmt = "su
16220 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
16230 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78   %d columns - ex
16240 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71  pected %d";.  sq
16250 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16260 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74  arse, zFmt, nAct
16270 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d  ual, nExpect);.}
16280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
16290 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
162a0 69 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  is a vector that
162b0 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69   has been used i
162c0 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72  n a context wher
162d0 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70  e.** it is not p
162e0 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78  ermitted. If pEx
162f0 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
16300 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20  ct vector, this 
16310 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64  routine .** load
16320 73 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  s the Parse obje
16330 63 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67  ct with a messag
16340 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
16350 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
16360 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
16370 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
16380 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  1".**.** Or, if 
16390 69 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20  it is a regular 
163a0 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a  scalar vector:.*
163b0 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75  *.**   "row valu
163c0 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20  e misused".*/   
163d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63  .void sqlite3Vec
163e0 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73  torErrorMsg(Pars
163f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
16400 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66  *pExpr){.#ifndef
16410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16420 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
16430 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
16440 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  sSelect ){.    s
16450 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
16460 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78  rror(pParse, pEx
16470 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
16480 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29  EList->nExpr, 1)
16490 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
164a0 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
164b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
164c0 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
164d0 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  sed");.  }.}../*
164e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
164f0 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
16500 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
16510 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
16520 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
16530 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
16540 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
16550 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
16560 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
16570 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
16580 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
16590 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
165a0 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
165b0 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
165c0 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
165d0 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
165e0 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
165f0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
16600 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
16610 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
16620 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
16630 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
16640 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
16650 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
16660 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
16670 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
16680 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
16690 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
166a0 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
166b0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
166c0 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
166d0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
166e0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
166f0 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
16700 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
16710 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
16720 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
16730 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
16740 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
16750 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
16760 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
16770 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
16780 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
16790 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
167a0 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
167b0 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
167c0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
167d0 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
167e0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
167f0 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
16800 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
16810 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
16820 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
16830 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
16840 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
16850 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
16860 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
16870 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
16880 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c  ns NULLs..** All
16890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
168a0 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
168b0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
168c0 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
168d0 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  ull.** to NULL. 
168e0 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
168f0 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  s will take care
16900 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
16910 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61  s register.** va
16920 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
16930 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
16940 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46  LL-free..**.** F
16950 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
16960 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
16970 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
16980 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
16990 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
169a0 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d  or a multi-colum
169b0 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65  n SELECT, the re
169c0 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
169d0 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a  n a contiguous.*
169e0 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
169f0 74 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74  ters and the ret
16a00 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
16a10 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
16a20 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65   left-most.** re
16a30 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65  sult column.  Re
16a40 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70  turn 0 for IN op
16a50 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
16a60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
16a70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16a80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
16a90 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
16aa0 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
16ab0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16ac0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16ad0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16ae0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16af0 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
16b00 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
16b10 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
16b20 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
16b30 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16b40 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
16b50 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
16b60 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
16b70 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
16b80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
16b90 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
16ba0 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
16bb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
16bc0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16bf0 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
16c00 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16c30 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
16c40 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
16c50 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
16c60 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16c70 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
16c80 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
16c90 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
16ca0 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49  on of the IN/EXI
16cb0 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20  STS/SELECT must 
16cc0 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72  be repeated ever
16cd0 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69  y time it.  ** i
16ce0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
16cf0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
16d00 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
16d10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
16d20 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
16d30 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
16d40 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
16d50 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
16d60 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
16d70 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
16d80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
16d90 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
16da0 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
16db0 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
16dc0 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
16dd0 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
16de0 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
16df0 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
16e00 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
16e10 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
16e20 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
16e30 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
16e40 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
16e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
16e60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16e70 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
16e80 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44  t) ){.    jmpIfD
16e90 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33  ynamic = sqlite3
16ea0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
16eb0 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
16ec0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
16ed0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
16ee0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
16ef0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
16f00 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
16f10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16f20 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
16f30 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
16f40 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
16f50 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16f60 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
16f70 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
16f80 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
16f90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16fa0 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
16fb0 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
16fc0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  /.      int nVal
16fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16fe0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
16ff0 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
17000 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c       .      nVal
17010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
17020 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
17030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17040 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d  isRowid || nVal=
17050 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
17060 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
17070 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
17080 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
17090 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
170a0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
170b0 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
170c0 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
170d0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
170e0 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
170f0 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78  illed with index
17100 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
17110 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  ng the results f
17120 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  rom the .      *
17130 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  * SELECT or the 
17140 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
17150 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
17160 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
17170 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
17180 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
17190 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
171a0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
171b0 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
171c0 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
171d0 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
171e0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
171f0 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
17200 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
17210 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
17220 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
17230 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
17240 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
17250 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
17260 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
17270 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
17280 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
17290 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
172a0 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
172b0 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
172c0 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
172d0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
172e0 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
172f0 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
17300 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
17310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
17320 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
17330 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
17340 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17350 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17360 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
17370 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
17380 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f  r->iTable, (isRo
17390 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20  wid?0:nVal));.  
173a0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69      pKeyInfo = i
173b0 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c  sRowid ? 0 : sql
173c0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
173d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
173e0 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  l, 1);..      if
173f0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17400 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17410 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
17420 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
17430 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
17440 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
17450 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
17460 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
17470 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
17480 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
17490 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
174a0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
174b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
174c0 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
174d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
174e0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
174f0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
17500 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ct;.        Expr
17510 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
17520 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
17530 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17540 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
17550 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55  e, 1, "%sLIST SU
17560 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20  BQUERY",.       
17570 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
17580 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
17590 54 45 44 20 22 0a 20 20 20 20 20 20 20 20 29 29  TED ".        ))
175a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
175b0 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
175c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
175d0 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74  LHS and RHS of t
175e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64  he IN operator d
175f0 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61  o not match, tha
17600 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  t.        ** err
17610 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
17620 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
17630 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
17640 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
17650 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
17660 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
17670 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
17680 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
17690 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
176a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
176b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
176c0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
176d0 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
176e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
176f0 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
17700 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
17710 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
17720 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
17730 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
17740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17750 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
17760 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
17770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
17780 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
17790 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
177a0 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
177b0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
177c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
177d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
177e0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
177f0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
17800 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17810 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
17820 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
17830 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17840 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
17850 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
17860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
17890 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
178a0 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
178b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
178c0 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
178d0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
178e0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
178f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
17900 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
17910 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
17920 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17930 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
17940 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
17950 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
17960 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
17970 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
17980 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
17990 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
179a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
179b0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
179c0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
179d0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
179e0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
179f0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
17a00 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
17a10 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20  CollSeq(.       
17a20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
17a30 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
17a40 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20  .pExpr.         
17a50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
17a60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17a70 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17a80 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
17a90 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
17aa0 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17ab0 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17ac0 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
17ad0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
17ae0 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
17af0 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
17b00 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
17b10 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
17b20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
17b30 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17b40 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
17b50 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
17b60 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
17b70 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17b80 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17b90 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17ba0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17bb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
17bc0 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
17bd0 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
17be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
17bf0 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
17c00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
17c10 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
17c20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
17c30 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
17c40 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17c50 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17c60 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
17c70 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17c80 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
17c90 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
17ca0 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  3;.        affin
17cb0 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17cc0 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17cd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
17ce0 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
17cf0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
17d00 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
17d10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17d20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
17d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
17d40 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17d50 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17d60 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17d70 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
17d80 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
17d90 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
17da0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17db0 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
17dc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17dd0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17de0 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
17df0 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
17e00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
17e10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17e20 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
17e30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17e40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17e50 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
17e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  4(v, OP_Blob, 0,
17e80 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53   r2, 0, "", P4_S
17e90 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
17ea0 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17eb0 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17ec0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17ed0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
17ee0 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
17ef0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
17f00 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
17f10 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
17f20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
17f30 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
17f40 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
17f50 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
17f60 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
17f70 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
17f80 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
17f90 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
17fa0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
17fb0 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
17fc0 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
17fd0 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
17fe0 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
17ff0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
18000 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
18010 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
18020 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
18030 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
18040 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
18050 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
18060 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
18070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
18080 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18090 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44  ToNoop(v, jmpIfD
180a0 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20  ynamic);.       
180b0 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
180c0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
180d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
180e0 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
180f0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
18100 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
18110 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
18120 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
18130 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
18140 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
18150 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
18160 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
18170 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18180 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
18190 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
181a0 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
181b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
181c0 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
181d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
181e0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
181f0 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
18200 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
18210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18230 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
18240 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18270 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18280 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
18290 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
182a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
182b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
182c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
182d0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
182e0 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
182f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
18310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18320 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
18330 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
18340 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
18350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18360 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
18370 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
18380 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
18390 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
183a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
183b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
183c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
183d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
183e0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
183f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18400 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18410 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
18420 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
18430 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18440 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
18450 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
18460 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
18470 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
18480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18490 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
184a0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
184b0 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
184c0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
184d0 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45  * Case 3:    (SE
184e0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
184f0 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .).      **     
18500 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45  or:    EXISTS(SE
18510 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
18520 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .).      **.    
18530 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43    ** For a SELEC
18540 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
18550 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
18560 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  es for all colum
18570 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ns of.      ** t
18580 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74  he first row int
18590 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
185a0 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75  gisters and retu
185b0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
185c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
185d0 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20  st register..   
185e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
185f0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
18600 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e  STS, write an in
18610 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
18620 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
18630 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  s).      ** into
18640 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
18650 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69  return that regi
18660 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20  ster number..   
18670 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
18680 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
18690 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
186a0 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
186b0 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20   1".  Any .     
186c0 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
186d0 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64  limit is discard
186e0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
186f0 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a  he new LIMIT 1..
18700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
18710 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
18740 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
18750 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
18760 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
18790 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
187a0 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
187b0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
187e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
187f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
18800 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
18820 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69  w limit expressi
18830 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  on */..      tes
18840 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
18850 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
18860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18870 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18880 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
18890 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
188a0 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
188b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
188c0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
188d0 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
188e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
188f0 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20  Select) );..    
18900 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
18910 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
18920 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
18930 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
18940 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59  sSCALAR SUBQUERY
18950 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  ",.            j
18960 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
18970 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 29  ":"CORRELATED ")
18980 29 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20  );.      nReg = 
18990 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
189a0 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c  LECT ? pSel->pEL
189b0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a  ist->nExpr : 1;.
189c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
189d0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
189e0 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  t, 0, pParse->nM
189f0 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61  em+1);.      pPa
18a00 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
18a10 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  g;.      if( pEx
18a20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18a30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
18a40 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
18a50 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
18a60 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44  iSdst = dest.iSD
18a70 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  Parm;.        de
18a80 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b  st.nSdst = nReg;
18a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18aa0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18ab0 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
18ac0 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44  SDParm, dest.iSD
18ad0 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20  Parm+nReg-1);.  
18ae0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18af0 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
18b00 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
18b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18b20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
18b30 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
18b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18b60 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
18b70 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
18b80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18b90 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
18ba0 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
18bb0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
18bc0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
18bd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
18be0 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33  INTEGER,&sqlite3
18bf0 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
18c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
18c10 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
18c20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
18c30 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
18c40 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
18c50 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
18c60 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c  pSel->pLimit->pL
18c70 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  eft = pLimit;.  
18c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c90 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
18ca0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
18cb0 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c  Parse, TK_LIMIT,
18cc0 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   pLimit, 0);.   
18cd0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d     }.      pSel-
18ce0 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
18cf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
18d00 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
18d10 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
18d20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
18d40 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
18d50 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
18d60 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
18d70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
18d80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18d90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
18da0 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
18db0 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
18dc0 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
18dd0 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
18de0 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
18df0 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
18e00 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
18e10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18e20 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
18e30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
18e40 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
18e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18e60 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
18e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18e80 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70  BQUERY./*.** Exp
18e90 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e  r pIn is an IN(.
18ea0 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
18eb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
18ec0 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a  ecks that the .*
18ed0 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20  * sub-select on 
18ee0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
18ef0 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73  N() operator has
18f00 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
18f10 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20   of .** columns 
18f20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e  as the vector on
18f30 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66   the LHS. Or, if
18f40 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
18f50 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  IN() is not .** 
18f60 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61  a sub-query, tha
18f70 74 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76  t the LHS is a v
18f80 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e  ector of size 1.
18f90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18fa0 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65  xprCheckIN(Parse
18fb0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18fc0 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63  pIn){.  int nVec
18fd0 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
18fe0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d  rVectorSize(pIn-
18ff0 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28  >pLeft);.  if( (
19000 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  pIn->flags & EP_
19010 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
19020 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70    if( nVector!=p
19030 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
19040 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
19050 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
19060 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
19070 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  se, pIn->x.pSele
19080 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
19090 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  r, nVector);.   
190a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
190b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
190c0 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20  Vector!=1 ){.   
190d0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
190e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
190f0 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  In->pLeft);.    
19100 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
19110 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
19120 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
19130 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19140 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19150 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
19160 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
19170 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
19180 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
19190 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
191a0 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
191b0 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
191c0 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
191d0 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78  lar or vector ex
191e0 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a  pression.  The .
191f0 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
19200 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61  de (RHS) is an a
19210 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
19220 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75  more scalar valu
19230 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71  es, or a.** subq
19240 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48  uery.  If the RH
19250 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  S is a subquery,
19260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
19270 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75  esult columns mu
19280 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20  st.** match the 
19290 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
192a0 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  s in the vector 
192b0 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20  on the LHS.  If 
192c0 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20  the RHS is.** a 
192d0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20  list of values, 
192e0 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
192f0 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a  a scalar. .**.**
19300 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
19310 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
19320 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e  LHS value is con
19330 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
19340 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65  e RHS..** The re
19350 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66  sult is false if
19360 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69   the LHS is defi
19370 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68  nitely not in th
19380 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20  e RHS.  The .** 
19390 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69  result is NULL i
193a0 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  f the presence o
193b0 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65  f the LHS in the
193c0 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a   RHS cannot be .
193d0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75  ** determined du
193e0 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a  e to NULLs..**.*
193f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
19400 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
19410 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74  at jumps to dest
19420 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
19430 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
19440 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
19450 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
19460 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
19470 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
19480 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
19490 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
194a0 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
194b0 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
194c0 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
194d0 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
194e0 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
194f0 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20   through..**.** 
19500 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65  See the separate
19510 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
19520 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
19530 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69  le in the canoni
19540 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f  cal.** SQLite so
19550 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64  urce tree for ad
19560 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19570 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
19580 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19590 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
195a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
195b0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
195c0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
195d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
195e0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
195f0 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
19600 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
19610 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
19620 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19630 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
19640 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
19650 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
19660 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
19670 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
19680 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
19690 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
196a0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
196b0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
196c0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
196d0 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
196e0 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
196f0 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
19700 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
19710 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
19720 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  HS */.  int rLhs
19730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19740 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c   Register(s) hol
19750 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c  ding the LHS val
19760 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  ues */.  int rLh
19770 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f  sOrig;         /
19780 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69  * LHS values pri
19790 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67  or to reordering
197a0 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20   by aiMap[] */. 
197b0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
197c0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
197d0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
197e0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
197f0 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  *aiMap = 0;     
19800 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65    /* Map from ve
19810 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e  ctor field to in
19820 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  dex column */.  
19830 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20  char *zAff = 0; 
19840 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
19850 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d  y string for com
19860 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e  parisons */.  in
19870 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20  t nVector;      
19880 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
19890 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20  ectors for this 
198a0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
198b0 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20   int iDummy;    
198c0 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20         /* Dummy 
198d0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70  parameter to exp
198e0 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f  rCodeVector() */
198f0 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20  .  Expr *pLeft; 
19900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19910 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
19920 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
19930 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
19940 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65    /* loop counte
19950 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  r */.  int destS
19960 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20  tep2;        /* 
19970 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68  Where to jump wh
19980 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e  en NULLs seen in
19990 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74   step 2 */.  int
199a0 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20   destStep6 = 0; 
199b0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
199c0 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a  ode for Step 6 *
199d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74  /.  int addrTrut
199e0 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  hOp;      /* Add
199f0 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74  ress of opcode t
19a00 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74  hat determines t
19a10 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f  he IN is true */
19a20 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75  .  int destNotNu
19a30 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ll;      /* Jump
19a40 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61   here if a compa
19a50 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75  rison is not tru
19a60 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20  e in step 6 */. 
19a70 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
19a80 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
19a90 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70   the step-6 loop
19aa0 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20   */ ..  pLeft = 
19ab0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
19ac0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
19ad0 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
19ae0 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
19af0 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
19b00 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
19b10 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f  pExpr);.  nVecto
19b20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
19b30 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
19b40 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
19b50 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
19b60 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
19b70 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
19b80 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
19b90 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
19ba0 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
19bb0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19bc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
19bd0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
19be0 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b  odeIN_oom_error;
19bf0 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
19c00 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48  o compute the RH
19c10 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74  S. After this st
19c20 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ep, if anything 
19c30 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  other than.  ** 
19c40 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
19c50 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74   returned, the t
19c60 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20  able opened ith 
19c70 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54  cursor pExpr->iT
19c80 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  able .  ** conta
19c90 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
19ca0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
19cb0 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58  RHS. If IN_INDEX
19cc0 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
19cd0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20  d,.  ** the RHS 
19ce0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
19cf0 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20   coded.  */.  v 
19d00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19d10 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
19d20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
19d30 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
19d40 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
19d50 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19d60 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
19d70 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
19d80 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
19d90 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
19da0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
19dd0 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
19de0 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
19e10 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
19e20 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
19e30 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20  ull, aiMap);..  
19e40 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19e50 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
19e60 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
19e70 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
19e80 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19e90 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
19ea0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19eb0 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
19ec0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19ed0 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
19ee0 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
19ef0 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
19f00 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
19f10 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
19f20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
19f30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
19f40 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
19f50 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
19f60 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
19f70 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
19f80 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
19f90 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
19fa0 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
19fb0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
19fc0 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
19fd0 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
19fe0 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
19ff0 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
1a000 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
1a010 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
1a020 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
1a030 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
1a040 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
1a050 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
1a060 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a070 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
1a080 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
1a090 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
1a0a0 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
1a0b0 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
1a0c0 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
1a0d0 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
1a0e0 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
1a0f0 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
1a100 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
1a110 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
1a120 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
1a130 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
1a140 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
1a150 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
1a160 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
1a170 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  /.  rLhsOrig = e
1a180 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
1a190 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
1a1a0 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
1a1b0 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
1a1c0 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
1a1d0 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
1a1e0 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
1a1f0 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
1a200 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
1a210 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
1a220 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
1a230 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
1a240 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a250 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
1a260 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
1a270 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
1a280 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
1a290 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a2a0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a2b0 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
1a2c0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a2d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a2f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
1a300 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
1a310 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
1a320 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
1a330 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a340 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
1a350 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
1a360 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
1a370 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
1a380 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
1a390 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
1a3a0 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
1a3b0 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
1a3c0 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
1a3d0 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
1a3e0 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
1a3f0 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
1a400 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
1a410 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a420 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
1a430 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
1a440 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1a450 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
1a460 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1a470 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a480 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
1a490 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
1a4a0 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
1a4b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a4c0 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
1a4d0 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
1a4e0 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
1a4f0 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
1a500 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1a510 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1a520 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1a530 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
1a540 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
1a550 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
1a560 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
1a570 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1a580 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1a590 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a5a0 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20  P_BitAnd, rLhs, 
1a5b0 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  rLhs, regCkNull)
1a5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1a5d0 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
1a5e0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1a5f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1a600 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1a610 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
1a620 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
1a630 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
1a640 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
1a650 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1a660 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
1a670 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1a680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a690 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
1a6a0 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
1a6b0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1a6c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
1a6d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1a6e0 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
1a6f0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
1a700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a710 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
1a720 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c  , rLhs, labelOk,
1a730 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a750 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1a760 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1a770 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a780 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
1a790 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
1a7a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1a7b0 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
1a7c0 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
1a7d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1a7e0 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a  P5(v, zAff[0]);.
1a7f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a800 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
1a810 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1a820 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
1a830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a840 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1a850 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
1a860 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1a880 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
1a890 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65  LLSEQ); VdbeCove
1a8a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1a8b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a8c0 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20  geP5(v, zAff[0] 
1a8d0 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
1a8e0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
1a8f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1a900 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1a910 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
1a920 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
1a930 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
1a940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a950 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1a960 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
1a970 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
1a980 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
1a990 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1a9a0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1a9b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a9c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a9d0 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
1a9e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a9f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1aa00 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1aa10 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1aa20 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
1aa30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1aa40 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  2: Check to see 
1aa50 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61  if the LHS conta
1aa60 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c  ins any NULL col
1aa70 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20  umns.  If the.  
1aa80 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74  ** LHS does cont
1aa90 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74  ain NULLs then t
1aaa0 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1aab0 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f  e either FALSE o
1aac0 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20  r NULL..  ** We 
1aad0 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74  will then skip t
1aae0 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
1aaf0 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1ab00 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
1ab10 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
1ab20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  ){.    destStep2
1ab30 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1ab40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
1ab50 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65  tStep2 = destSte
1ab60 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
1ab70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ab80 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1ab90 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1aba0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1abb0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
1abc0 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
1abd0 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ft, i);.    if( 
1abe0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1abf0 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20  Null(p) ){.     
1ac00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac10 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1ac20 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65   rLhs+i, destSte
1ac30 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p2);.      VdbeC
1ac40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1ac50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  }.  }..  /* Step
1ac60 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20   3.  The LHS is 
1ac70 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20  now known to be 
1ac80 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68  non-NULL.  Do th
1ac90 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a  e binary search.
1aca0 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20    ** of the RHS 
1acb0 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73  using the LHS as
1acc0 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f   a probe.  If fo
1acd0 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  und, the result 
1ace0 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20  is.  ** true..  
1acf0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1ad00 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
1ad10 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
1ad20 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
1ad30 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
1ad40 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20  able b-tree and 
1ad50 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a  so we also.    *
1ad60 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  * know that the 
1ad70 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e  RHS is non-NULL.
1ad80 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62    Hence, we comb
1ad90 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20  ine steps 3 and 
1ada0 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20  4.    ** into a 
1adb0 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a  single opcode. *
1adc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1add0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
1ade0 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e  ekRowid, pExpr->
1adf0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1ae00 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
1ae10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ae20 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1ae30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ae40 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
1ae50 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
1ae60 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
1ae70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ae80 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1ae90 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
1aea0 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
1aeb0 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
1aec0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1aed0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
1aee0 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
1aef0 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
1af00 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1af10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1af20 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1af30 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
1af40 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1af50 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1af80 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1af90 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
1afa0 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1afb0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1afc0 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
1afd0 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
1afe0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
1aff0 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
1b000 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
1b010 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1b020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b030 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
1b040 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1b050 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1b080 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1b090 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1b0a0 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1b0b0 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1b0c0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1b0d0 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1b0e0 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1b0f0 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1b100 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1b110 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1b120 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1b130 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1b140 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1b150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b160 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1b170 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1b180 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1b190 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b1a0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1b1b0 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1b1c0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1b1d0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1b1e0 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1b1f0 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1b200 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1b210 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1b220 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1b230 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1b240 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1b250 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1b260 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1b270 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1b280 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1b290 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1b2a0 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1b2b0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1b2c0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1b2d0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1b2e0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1b2f0 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1b300 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1b310 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1b320 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1b330 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1b340 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1b350 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1b360 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1b370 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1b380 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1b390 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b3a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1b3b0 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1b3c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1b3d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1b3e0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1b3f0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
1b400 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
1b410 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
1b420 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
1b430 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
1b440 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1b460 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31  * For nVector==1
1b470 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  , combine steps 
1b480 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64  6 and 7 by immed
1b490 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67  iately returning
1b4a0 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66  .    ** FALSE if
1b4b0 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   the first compa
1b4c0 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  rison is not NUL
1b4d0 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74  L */.    destNot
1b4e0 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c  Null = destIfFal
1b4f0 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  se;.  }.  for(i=
1b500 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1b510 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
1b520 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1b530 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20  oll;.    int r3 
1b540 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1b550 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1b560 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74   p = sqlite3Vect
1b570 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1b580 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43  Left, i);.    pC
1b590 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1b5a0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1b5b0 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
1b5c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1b5d0 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
1b5e0 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a  iTable, i, r3);.
1b5f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b600 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1b610 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e  rLhs+i, destNotN
1b620 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  ull, r3,.       
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b640 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1b650 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64  COLLSEQ);.    Vd
1b660 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b670 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b680 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b690 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   r3);.  }.  sqli
1b6a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b6b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1b6c0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  tIfNull);.  if( 
1b6d0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1b6e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b6f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1b700 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  NotNull);.    sq
1b710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b720 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70  v, OP_Next, pExp
1b730 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54  r->iTable, addrT
1b740 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43  op+1);.    VdbeC
1b750 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
1b760 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20   /* Step 7:  If 
1b770 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1b780 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  int, we know tha
1b790 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  t the result mus
1b7a0 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73  t.    ** be fals
1b7b0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1b7c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b7d0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
1b7e0 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  fFalse);.  }..  
1b7f0 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e  /* Jumps here in
1b800 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e   order to return
1b810 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   true. */.  sqli
1b820 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1b830 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b  v, addrTruthOp);
1b840 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ..sqlite3ExprCod
1b850 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  eIN_finished:.  
1b860 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72  if( rLhs!=rLhsOr
1b870 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  ig ) sqlite3Rele
1b880 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b890 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64 62 65  e, rLhs);.  Vdbe
1b8a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
1b8b0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c   IN expr"));.sql
1b8c0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
1b8d0 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  om_error:.  sqli
1b8e0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1b8f0 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
1b900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b910 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1b920 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b930 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b940 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
1b950 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1b960 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
1b970 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1b980 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1b990 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
1b9a0 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
1b9b0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
1b9c0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1b9d0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1b9e0 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
1b9f0 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
1ba00 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
1ba10 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
1ba20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
1ba30 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
1ba40 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1ba50 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
1ba60 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
1ba70 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
1ba80 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
1ba90 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
1baa0 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
1bab0 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1bac0 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
1bad0 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
1bae0 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
1baf0 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
1bb00 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
1bb10 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
1bb20 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
1bb30 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1bb40 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
1bb50 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
1bb60 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
1bb70 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
1bb80 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
1bb90 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
1bba0 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
1bbb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1bbc0 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
1bbd0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1bbe0 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
1bbf0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
1bc00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1bc10 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1bc20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1bc30 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
1bc40 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
1bc50 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1bc60 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1bc70 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
1bc80 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
1bc90 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
1bca0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1bcb0 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
1bcc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1bcd0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
1bce0 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
1bcf0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1bd00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1bd10 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1bd20 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
1bd30 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
1bd40 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
1bd50 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
1bd60 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
1bd70 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
1bd80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bd90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1bda0 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
1bdb0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
1bdc0 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
1bdd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1bde0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1bdf0 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
1be00 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
1be10 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1be20 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
1be30 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26  .    if( (c==3 &
1be40 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28  & !negFlag) || (
1be50 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61  c==2) || (negFla
1be60 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c  g && value==SMAL
1be70 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69  LEST_INT64)){.#i
1be80 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1be90 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1bea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1beb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
1bec0 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
1bed0 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1bee0 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
1bef0 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
1bf00 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
1bf10 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
1bf20 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1bf30 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
1bf40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1bf50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bf60 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
1bf70 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e  oo big: %s%s", n
1bf80 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29  egFlag?"-":"",z)
1bf90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
1bfa0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
1bfb0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1bfc0 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
1bfd0 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
1bfe0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1bff0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1c000 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20  ){ value = c==3 
1c010 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
1c020 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
1c030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c040 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
1c050 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
1c060 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1c070 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a  4_INT64);.    }.
1c080 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72    }.}.../* Gener
1c090 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1c0a0 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67  ll load into reg
1c0b0 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76  ister regOut a v
1c0c0 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  alue that is.** 
1c0d0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1c0e0 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63  the iIdxCol-th c
1c0f0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
1c100 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Idx..*/.void sql
1c110 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
1c120 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50  IndexColumn(.  P
1c130 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f  arse *pParse,  /
1c140 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1c150 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
1c160 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68   *pIdx,    /* Th
1c170 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f  e index whose co
1c180 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f  lumn is to be lo
1c190 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  aded */.  int iT
1c1a0 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72  abCur,    /* Cur
1c1b0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1c1c0 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  a table row */. 
1c1d0 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20   int iIdxCol,   
1c1e0 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
1c1f0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62  f the index to b
1c200 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1c210 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1c220 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78   Store the index
1c230 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1c240 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1c250 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43  /.){.  i16 iTabC
1c260 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
1c270 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20  umn[iIdxCol];.  
1c280 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f  if( iTabCol==XN_
1c290 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65  EXPR ){.    asse
1c2a0 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1c2b0 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pr );.    assert
1c2c0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c2d0 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20  ->nExpr>iIdxCol 
1c2e0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
1c2f0 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75  SelfTab = iTabCu
1c300 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r + 1;.    sqlit
1c310 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
1c320 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f  Parse, pIdx->aCo
1c330 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
1c340 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29  ].pExpr, regOut)
1c350 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1c360 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65  elfTab = 0;.  }e
1c370 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1c380 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1c390 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
1c3a0 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
1c3b0 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
1c3f0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1c400 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c410 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1c420 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
1c430 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
1c440 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1c450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c460 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
1c470 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
1c480 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
1c490 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1c4a0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c4b0 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
1c4c0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1c4d0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
1c4e0 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1c4f0 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
1c500 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
1c510 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
1c520 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
1c530 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
1c540 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
1c550 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
1c560 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c570 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1c580 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
1c590 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
1c5a0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
1c5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c5c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c5d0 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43  umn, iTabCur, iC
1c5e0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20  ol, regOut);.   
1c5f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
1c600 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
1c610 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
1c620 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c630 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1c640 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
1c650 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
1c660 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
1c670 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
1c680 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
1c690 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
1c6a0 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
1c6b0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1c6c0 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
1c6d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20  Tab) ){.      x 
1c6e0 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
1c6f0 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72  fIndex(sqlite3Pr
1c700 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
1c710 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ab), iCol);.    
1c720 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1c730 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
1c740 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
1c750 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
1c760 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
1c770 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
1c780 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
1c790 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1c7a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c7b0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1c7c0 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
1c7d0 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
1c7e0 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
1c7f0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
1c800 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1c810 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a 2a 2a  gister iReg. .**
1c820 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1c830 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
1c840 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
1c850 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1c860 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
1c870 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
1c880 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
1c890 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
1c8a0 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
1c8b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1c8c0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c8d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c8e0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
1c8f0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1c900 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1c910 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1c920 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1c930 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
1c940 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
1c950 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
1c960 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
1c970 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1c980 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
1c990 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
1c9a0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
1c9b0 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
1c9c0 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
1c9d0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
1c9e0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
1c9f0 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
1ca00 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
1ca10 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41   OP_Column + FLA
1ca20 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  GS */.){.  Vdbe 
1ca30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ca40 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
1ca50 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1ca60 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1ca70 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
1ca80 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
1ca90 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70  , iReg);.  if( p
1caa0 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  5 ){.    sqlite3
1cab0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1cac0 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p5);.  }.  retur
1cad0 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
1cae0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1caf0 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
1cb00 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
1cb10 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
1cb20 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
1cb30 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a  o..iTo+nReg-1..*
1cb40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1cb50 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
1cb60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1cb70 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
1cb80 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72  t nReg){.  asser
1cb90 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
1cba0 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
1cbb0 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
1cbc0 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
1cbd0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
1cbe0 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
1cbf0 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nReg);.}../*.**
1cc00 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1cc10 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1cc20 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1cc30 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1cc40 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1cc50 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1cc60 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1cc70 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1cc80 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1cc90 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1cca0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1ccb0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1ccc0 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1ccd0 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1cce0 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1ccf0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1cd00 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1cd10 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1cd20 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1cd30 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1cd40 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1cd50 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1cd60 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1cd70 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1cd80 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1cd90 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1cda0 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1cdb0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1cdc0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1cdd0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1cde0 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1cdf0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1ce00 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1ce10 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1ce20 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1ce30 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1ce40 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1ce50 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1ce60 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1ce70 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1ce80 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1ce90 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1cea0 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1ceb0 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1cec0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1ced0 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1cee0 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1cef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1cf00 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1cf10 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1cf20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1cf30 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1cf40 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1cf50 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1cf60 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1cf70 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1cf80 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1cf90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cfa0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1cfb0 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1cfc0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1cfd0 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1cfe0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1cff0 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1d000 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1d010 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1d020 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1d030 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d040 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1d050 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1d060 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d070 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d080 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1d090 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1d0a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1d0b0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1d0c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d0d0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1d0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d0f0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1d100 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1d110 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1d120 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1d130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d140 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1d150 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1d160 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1d170 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1d180 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1d190 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1d1a0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1d1b0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d1c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1d1d0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1d1e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1d1f0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1d200 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1d210 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1d220 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1d230 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1d240 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1d250 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1d260 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1d270 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1d280 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1d290 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1d2a0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1d2b0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1d2c0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1d2d0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1d2e0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1d2f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1d300 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1d310 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1d320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d330 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1d340 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1d350 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1d360 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d370 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1d380 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1d390 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1d3a0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1d3b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d3c0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1d3d0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1d3e0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1d3f0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1d400 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1d410 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1d420 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1d430 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d440 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d450 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d460 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d470 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1d480 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1d490 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1d4a0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1d4b0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1d4d0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1d4e0 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1d4f0 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1d500 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1d510 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1d520 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1d530 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1d540 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1d550 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1d560 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1d570 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d580 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d590 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1d5a0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f  rn 0;.  }..expr_
1d5b0 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69  code_doover:.  i
1d5c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1d5d0 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1d5e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1d5f0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1d600 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1d610 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1d620 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1d630 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1d640 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1d650 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1d660 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1d670 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1d680 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1d690 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1d6a0 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1d6b0 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1d6c0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1d6d0 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1d6e0 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1d6f0 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1d700 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1d710 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1d720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d730 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1d740 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1d750 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1d760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d780 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1d790 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1d7a0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1d7b0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1d7c0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1d7d0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1d7e0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1d7f0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1d800 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1d810 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1d820 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1d830 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d840 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d850 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
1d860 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1d870 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  s COLUMN express
1d880 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
1d890 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74 6f 20  constant due to 
1d8a0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1d8b0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1d8c0 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  nts, and that co
1d8d0 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65 64 20  nstant is coded 
1d8e0 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  by the pExpr->pL
1d8f0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  eft.        ** e
1d900 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77  xpresssion.  How
1d910 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72 65 20  ever, make sure 
1d920 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68 61 73  the constant has
1d930 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1d940 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79 70 65       ** datatype
1d950 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65   by applying the
1d960 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
1d970 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f   table column to
1d980 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d990 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20 20 20  constant..      
1d9a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
1d9b0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1d9c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1d9d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d9e0 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20 20  ft,target);.    
1d9f0 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20 73 71      int aff = sq
1da00 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
1da10 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1da20 79 2e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  y.pTab, pExpr->i
1da30 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1da40 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54 45   if( aff!=SQLITE
1da50 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
1da60 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
1da70 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d 20  nst char zAff[] 
1da80 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c 30  = "B\000C\000D\0
1da90 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20 20  00E";.          
1daa0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1dab0 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a  FF_BLOB=='A' );.
1dac0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dad0 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ( SQLITE_AFF_TEX
1dae0 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20 20  T=='B' );.      
1daf0 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61      if( iReg!=ta
1db00 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1db10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1db20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1db30 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 29  y, iReg, target)
1db40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 52  ;.            iR
1db50 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1db60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1db70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1db80 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1db90 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c  ity, iReg, 1, 0,
1dba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
1dbc0 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c  ff[(aff-'B')*2],
1dbd0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1dbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1dbf0 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20 20  eturn iReg;.    
1dc00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54    }.      if( iT
1dc10 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1dc20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  if( pParse->iSel
1dc30 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  fTab<0 ){.      
1dc40 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
1dc50 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
1dc60 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
1dc70 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
1dc80 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
1dc90 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1dca0 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d  Column - pParse-
1dcb0 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
1dcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dcd0 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e      /* Coding an
1dce0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1dcf0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   is part of an i
1dd00 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d  ndex where colum
1dd10 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20  n names.        
1dd20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
1dd30 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  x refer to the t
1dd40 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  able to which th
1dd50 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20  e index belongs 
1dd60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
1dd70 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  b = pParse->iSel
1dd80 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20  fTab - 1;.      
1dd90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1dda0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ddb0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1ddc0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1ddd0 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  >y.pTab,.       
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1de00 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
1de10 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
1de40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1de50 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1de60 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1de70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1de80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1de90 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1dea0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1deb0 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a  TK_TRUEFALSE: {.
1dec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ded0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1dee0 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78  teger, sqlite3Ex
1def0 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
1df00 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  pr), target);.  
1df10 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1df20 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1df30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1df40 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1df50 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1df60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1df70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1df80 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1df90 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
1dfa0 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
1dfb0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
1dfc0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1dfd0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1dfe0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1dff0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1e000 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e010 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e020 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e030 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e040 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1e050 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1e060 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1e070 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e090 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
1e0a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e0b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1e0c0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e0d0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e0e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e0f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1e100 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1e110 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1e120 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1e130 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1e140 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1e150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e160 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e170 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e180 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1e190 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e1a0 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1e1b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e1c0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1e1d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e1e0 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1e1f0 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1e200 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e210 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1e220 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1e230 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1e240 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1e250 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1e260 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1e270 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1e280 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1e290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e2a0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1e2b0 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1e2c0 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1e2d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e2e0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e2f0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e300 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1e310 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e320 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e330 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e350 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
1e360 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1e370 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e380 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
1e390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e3a0 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
1e3b0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1e3c0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1e3d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
1e3e0 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
1e3f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1e400 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1e410 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
1e420 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70  Parse->pVList, p
1e430 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1e440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e450 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e460 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d  0]=='?' || strcm
1e470 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1e480 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n, z)==0 );.    
1e490 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69      pParse->pVLi
1e4a0 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e  st[0] = 0; /* In
1e4b0 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79  dicate VList may
1e4c0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e   no longer be en
1e4d0 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  larged */.      
1e4e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
1e4f0 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29  endP4(v, (char*)
1e500 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  z, P4_STATIC);. 
1e510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e520 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e530 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
1e540 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1e550 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54  return pExpr->iT
1e560 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  able;.    }.#ifn
1e570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e580 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1e590 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1e5a0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1e5b0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1e5c0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1e5d0 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
1e5e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e5f0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1e600 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1e610 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1e620 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1e630 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e650 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1e660 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e670 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1e680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e6a0 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
1e6b0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1e6d0 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1e6e0 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1e6f0 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65  n, 0));.      re
1e700 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20  turn inReg;.    
1e710 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e720 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
1e730 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1e740 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1e750 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  T:.      op = (o
1e760 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1e770 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1e780 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c   p5 = SQLITE_NUL
1e790 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61  LEQ;.      /* fa
1e7a0 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll-through */.  
1e7b0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1e7c0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1e7d0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1e7e0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1e7f0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1e800 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1e810 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1e820 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1e830 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1e840 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
1e850 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
1e860 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70    codeVectorComp
1e870 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1e880 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70  r, target, op, p
1e890 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  5);.      }else{
1e8a0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1e8b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e8c0 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1e8d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1e8e0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1e8f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e900 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e910 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1e920 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  .        codeCom
1e930 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
1e940 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1e950 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1e960 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
1e970 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
1e980 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20   | p5);.        
1e990 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1e9a0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1e9b0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1e9c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e9d0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Lt);.        
1e9e0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
1e9f0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
1ea00 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
1ea10 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ea20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Le);.        
1ea30 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1ea40 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1ea50 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1ea60 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ea70 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Gt);.        
1ea80 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1ea90 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1eaa0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1eab0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1eac0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ge);.        
1ead0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1eae0 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1eaf0 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1eb00 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1eb10 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20  OP_Eq);.        
1eb20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
1eb30 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
1eb40 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
1eb50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1eb60 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ne);.        
1eb70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1eb80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1eb90 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1eba0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ebb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ebc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ebd0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
1ebe0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
1ebf0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
1ec00 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
1ec10 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
1ec20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
1ec30 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1ec40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1ec50 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
1ec60 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
1ec70 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
1ec80 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
1ec90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1eca0 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
1ecb0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
1ecc0 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
1ecd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ece0 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
1ecf0 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
1ed00 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
1ed10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ed20 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
1ed30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
1ed40 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
1ed50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ed60 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
1ed70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ed80 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
1ed90 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
1eda0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
1edb0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1edc0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
1edd0 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
1ede0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1edf0 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
1ee00 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
1ee10 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
1ee20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ee30 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
1ee40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1ee50 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
1ee60 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
1ee70 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
1ee80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ee90 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
1eea0 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
1eeb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
1eec0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
1eed0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
1eee0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
1eef0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ef00 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
1ef10 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1ef20 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
1ef30 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
1ef40 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
1ef50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ef60 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
1ef70 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
1ef80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ef90 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
1efa0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1efb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1efc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1efd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1efe0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1eff0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f000 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f010 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f030 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
1f040 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f050 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f060 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f070 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f080 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f090 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f0a0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1f0b0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f0c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f0d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
1f0e0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
1f0f0 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
1f100 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1f110 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
1f120 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
1f130 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  t, 1, target);. 
1f140 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1f150 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  rget;.#ifndef SQ
1f160 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1f170 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1f180 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1f190 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1f1a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f1b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f1c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f1d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1f1e0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1f1f0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1f200 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f210 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f220 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1f230 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
1f240 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
1f250 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
1f260 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
1f270 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
1f280 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
1f290 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
1f2a0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1f2b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f2c0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
1f2d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f2e0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f2f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f300 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f310 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1f320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f330 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1f340 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
1f350 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f360 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f370 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f380 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1f390 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f3a0 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
1f3b0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1f3c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1f3d0 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
1f3e0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1f3f0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
1f400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f410 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20  _NOT==OP_Not ); 
1f420 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f430 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
1f440 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f450 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f460 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f470 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f490 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f4b0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1f4c0 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
1f4d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f4e0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
1f4f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54   {.      int isT
1f500 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52  rue;    /* IS TR
1f510 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
1f520 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  E */.      int b
1f530 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20  Normal;   /* IS 
1f540 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45  TRUE or IS FALSE
1f550 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
1f560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f570 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f580 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f590 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1f5a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f5b0 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65   );.      isTrue
1f5c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
1f5d0 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
1f5e0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62  pRight);.      b
1f5f0 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e  Normal = pExpr->
1f600 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20  op2==TK_IS;.    
1f610 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
1f620 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1f630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f640 21 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d  !isTrue && bNorm
1f650 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  al);.      sqlit
1f660 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1f670 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31  v, OP_IsTrue, r1
1f680 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65  , inReg, !isTrue
1f690 2c 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d  , isTrue ^ bNorm
1f6a0 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
1f6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f6c0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1f6d0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1f6e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1f6f0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1f700 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1f710 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1f720 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1f730 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1f740 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1f750 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1f760 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1f770 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1f780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f790 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1f7a0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1f7b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f7c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f7d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f7e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f7f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f800 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f810 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1f820 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1f830 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1f840 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f850 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1f860 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f870 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1f880 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1f890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f8a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1f8b0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1f8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1f8d0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1f8e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f8f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1f900 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1f910 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1f920 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1f930 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1f940 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1f950 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f960 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f970 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1f980 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1f990 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f9a0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1f9b0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1f9c0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1f9d0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1f9e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f9f0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1fa00 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1fa10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1fa20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fa30 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1fa40 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1fa50 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1fa60 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1fa70 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1fa80 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1fa90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1faa0 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1fab0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1fac0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1fad0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1fae0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1faf0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1fb00 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1fb10 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1fb20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1fb30 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1fb40 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1fb50 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1fb60 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1fb70 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1fb80 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1fb90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1fba0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1fbb0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
1fbc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fbd0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
1fbe0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1fbf0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
1fc00 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
1fc10 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1fc20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
1fc30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
1fc40 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
1fc50 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
1fc60 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
1fc70 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64  quence */..#ifnd
1fc80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fc90 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
1fca0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1fcb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
1fcc0 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
1fcd0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1fce0 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  y.pWin->regResul
1fcf0 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
1fd00 66 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e  f..      if( Con
1fd10 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1fd20 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  e) && sqlite3Exp
1fd30 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
1fd40 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
1fd50 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
1fd60 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70  tions can be exp
1fd70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74  ensive. So try t
1fd80 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20  o move constant 
1fd90 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
1fda0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1fdb0 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e  inner loop, even
1fdc0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61   if that means a
1fdd0 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e  n extra OP_Copy.
1fde0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
1fdf0 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1fe00 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1fe10 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20   pExpr, -1);.   
1fe20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1fe30 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1fe40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1fe50 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1fe60 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1fe70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1fe80 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1fe90 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1fea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1feb0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1fec0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1fed0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
1fee0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
1fef0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
1ff00 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ff10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ff20 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1ff30 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
1ff40 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1ff50 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
1ff60 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1ff70 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
1ff80 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
1ff90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ffa0 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
1ffb0 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
1ffc0 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
1ffd0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1ffe0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1fff0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
20000 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
20010 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
20020 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20030 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20040 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
20050 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
20060 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20070 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
20080 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
20090 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
200a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
200b0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
200c0 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
200d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
200e0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
200f0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
20100 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
20110 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
20120 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
20130 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
20140 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
20150 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
20160 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
20170 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20180 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20190 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
201a0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
201b0 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
201c0 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
201d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
201e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
201f0 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
20200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20210 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
20220 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20230 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20240 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
20250 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
20280 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
20290 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
202a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
202b0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
202c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
202d0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
202e0 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
202f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
20300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20310 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20320 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
20330 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20340 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20350 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
20360 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20370 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
20380 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
20390 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
203a0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
203b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
203c0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
203d0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
203e0 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
203f0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20400 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
20410 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20420 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20430 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
20440 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20450 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
20460 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20470 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
20480 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
20490 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
204a0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
204b0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
204c0 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
204d0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
204e0 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
204f0 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
20500 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
20510 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
20520 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20530 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20540 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
20550 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
20560 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
20570 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
20580 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
20590 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
205a0 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
205b0 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
205c0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
205d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
205e0 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
205f0 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
20600 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
20610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
20620 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
20630 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b      aff ? azAff[
20660 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  aff-SQLITE_AFF_B
20670 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a  LOB] : "none");.
20680 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
20690 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23  arget;.      }.#
206a0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72  endif..      for
206b0 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
206c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
206d0 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
206e0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
206f0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
20710 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
20720 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
20730 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
20740 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
20750 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20760 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20770 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
20780 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
20790 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
207a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
207b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
207c0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
207d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
207e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
207f0 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
20800 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
20810 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
20820 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
20830 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
20840 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
20850 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
20860 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
20870 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
20880 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
20890 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
208a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
208b0 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
208c0 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
208d0 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
208e0 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
208f0 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
20900 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
20910 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
20920 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
20930 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
20940 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
20950 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
20960 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
20970 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
20980 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
20990 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
209a0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
209b0 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
209c0 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
209d0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
209e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
209f0 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
20a00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20a10 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
20a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
20a30 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
20a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
20a50 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
20a60 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
20a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
20a80 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
20a90 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
20aa0 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
20ab0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20ac0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
20ad0 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
20ae0 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
20af0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
20b00 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
20b10 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
20b20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20b30 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
20b40 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
20b50 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
20b60 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
20b70 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
20b80 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
20b90 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
20ba0 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
20bb0 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
20bc0 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
20bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20be0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
20bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
20c00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
20c10 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
20c40 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
20c50 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
20c60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20c70 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
20c80 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20c90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
20ca0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
20cb0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
20cc0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
20cd0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
20ce0 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
20cf0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
20d00 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
20d10 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
20d20 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
20d30 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
20d40 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
20d50 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
20d60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
20d70 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
20d80 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
20d90 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
20da0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
20db0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
20dc0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
20dd0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
20de0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
20df0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
20e00 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
20e10 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
20e20 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
20e30 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
20e40 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
20e50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
20e60 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
20e70 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
20e80 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
20e90 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
20ea0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
20eb0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
20ec0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
20ed0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
20ee0 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
20ef0 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
20f00 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
20f10 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
20f20 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
20f30 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
20f40 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
20f50 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  >=2 && ExprHasPr
20f60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20f70 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
20f80 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20f90 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
20fa0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
20fb0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
20fc0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
20fd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
20fe0 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
20ff0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
21000 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
21010 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
21020 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
21030 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21040 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
21050 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
21060 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21070 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
21080 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
21090 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
210a0 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
210b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
210c0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
210d0 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
210e0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
210f0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
21100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21110 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
21120 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70  FUNC.      if( p
21130 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21140 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46   SQLITE_FUNC_OFF
21150 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45  SET ){.        E
21160 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72  xpr *pArg = pFar
21170 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  g->a[0].pExpr;. 
21180 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
21190 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
211a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
211b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
211c0 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67   OP_Offset, pArg
211d0 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e  ->iTable, pArg->
211e0 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
211f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21220 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
21230 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
21240 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21250 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
21260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21270 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69  Op4(v, pParse->i
21280 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72  SelfTab ? OP_Pur
21290 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63  eFunc0 : OP_Func
212a0 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20  tion0,.         
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
212d0 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70  target, (char*)p
212e0 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
212f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21300 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21310 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
21320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21330 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
21340 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
21350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21360 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21370 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
21380 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21390 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
213a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
213b0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
213c0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
213d0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
213e0 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
213f0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
21400 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
21410 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
21420 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
21430 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21440 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21450 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
21460 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
21470 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
21480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21490 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
214a0 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
214b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
214c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
214d0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
214e0 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
214f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
21500 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21510 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21520 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b  SELECT_COLUMN: {
21530 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
21540 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
21550 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Left->iTable==0 
21560 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
21570 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21580 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
21590 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
215a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20  Expr->pLeft, 0, 
215b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
215c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
215d0 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
215e0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
215f0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21600 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
21610 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70  able.       && p
21620 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e  Expr->iTable!=(n
21630 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
21640 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
21650 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29  pLeft)) .      )
21660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21680 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
21690 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
216a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
216d0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
216e0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
216f0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21700 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
21710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21720 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
21730 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
21740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21750 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21760 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21780 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
217a0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
217b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
217c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
217d0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
217e0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
217f0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21810 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21820 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
21830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21840 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21850 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
21860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
21880 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
21890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
218a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
218b0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
218c0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
218d0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
218e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
218f0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
21900 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
21910 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
21920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21930 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
21940 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
21950 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
21960 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
21970 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
21980 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
21990 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
219a0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
219b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
219c0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
219d0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
219e0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
219f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
21a00 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
21a10 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
21a20 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
21a30 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
21a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21a50 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
21a60 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
21a70 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
21a80 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
21a90 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45  PLUS: {.      pE
21aa0 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
21ab0 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ft;.      goto e
21ac0 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b  xpr_code_doover;
21ad0 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20   /* 2018-04-28: 
21ae0 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63  Prevent deep rec
21af0 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e  ursion. OSSFuzz.
21b00 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63   */.    }..    c
21b10 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
21b20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
21b30 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
21b40 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
21b50 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
21b60 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
21b70 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
21b80 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
21b90 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
21ba0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
21bb0 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
21bc0 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
21bd0 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
21be0 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
21bf0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
21c00 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
21c10 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
21c20 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
21c30 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
21c40 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
21c50 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
21c60 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
21c70 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
21c80 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
21c90 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
21ca0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
21cb0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
21cc0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
21cd0 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
21ce0 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
21cf0 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
21d00 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
21d10 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
21d20 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
21d30 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
21d40 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
21d50 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
21d60 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
21d70 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
21d80 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
21d90 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
21da0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
21db0 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
21dc0 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
21dd0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
21de0 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
21df0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
21e00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
21e10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
21e20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
21e30 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
21e40 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
21e50 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
21e60 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
21e70 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
21e80 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
21e90 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
21ea0 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
21eb0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
21ec0 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
21ed0 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
21ee0 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
21ef0 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
21f00 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
21f10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
21f20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
21f30 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
21f40 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
21f50 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
21f60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
21f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
21f80 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
21f90 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
21fa0 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
21fb0 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
21fc0 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
21fd0 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
21fe0 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
21ff0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
22000 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
22010 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
22020 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
22030 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
22040 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22050 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
22060 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
22070 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
22080 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22090 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
220a0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
220b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
220c0 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
220d0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
220e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
220f0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
22100 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
22110 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
22120 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
22130 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
22140 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
22150 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
22160 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
22170 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
22180 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
221a0 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
221b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
221c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
221d0 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
221e0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
221f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
22200 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
22210 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22220 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
22230 64 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54  d" : pExpr->y.pT
22240 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22250 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
22260 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22280 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22290 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
222a0 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
222b0 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
222c0 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
222d0 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
222e0 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
222f0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
22300 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
22310 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
22320 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22330 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
22340 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22350 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22360 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22370 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22380 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22390 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
223a0 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
223b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
223c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
223d0 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
223e0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
223f0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
22400 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
22410 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
22420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22430 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
22440 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22450 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22470 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22480 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22490 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
224a0 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
224b0 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
224c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
224d0 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
224e0 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
224f0 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
22500 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
22510 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22520 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
22530 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
22540 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
22550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
22560 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
22570 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
22580 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22590 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
225a0 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
225b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
225c0 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
225d0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
225e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
225f0 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
22600 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
22610 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
22620 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
22630 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
22640 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22660 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
22670 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
22680 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
22690 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
226a0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
226b0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
226c0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
226d0 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
226e0 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
226f0 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
22700 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
22710 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
22720 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
22730 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
22740 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
22750 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
22760 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22770 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
22780 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
22790 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
227a0 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
227b0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
227c0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
227d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
227e0 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
227f0 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
22800 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
22810 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22820 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
22830 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
22840 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
22850 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
22860 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
22870 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
22880 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
22890 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
228a0 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
228b0 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
228c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
228d0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
228e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
228f0 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
22900 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
22910 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
22920 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
22930 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
22940 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
22950 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
22960 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
22970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
22980 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
22990 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
229a0 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
229b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229c0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
229d0 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
229e0 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
229f0 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22a20 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
22a30 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
22a40 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a60 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
22a70 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
22a80 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22ab0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
22ac0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22ad0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22ae0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
22af0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
22b00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22b10 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
22b20 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
22b30 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
22b40 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
22b50 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
22b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
22b70 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
22b80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22bb0 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
22bc0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
22bd0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
22be0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
22bf0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
22c00 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
22c10 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
22c20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22c30 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
22c40 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
22c50 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
22c60 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
22c70 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
22c80 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
22c90 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
22ca0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
22cb0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
22cc0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
22cd0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
22ce0 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
22cf0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
22d00 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
22d10 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
22d20 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
22d30 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
22d40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22d50 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
22d60 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
22d70 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
22d80 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
22d90 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
22da0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
22db0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
22dc0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
22dd0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
22de0 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
22df0 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
22e00 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
22e10 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
22e20 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
22e30 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
22e40 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
22e50 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
22e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
22e70 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
22e80 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
22e90 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
22ea0 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
22eb0 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
22ec0 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
22ed0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
22ee0 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
22ef0 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
22f00 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
22f10 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
22f20 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
22f30 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
22f40 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
22f50 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
22f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
22f70 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
22f80 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
22f90 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
22fa0 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
22fb0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
22fc0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
22fd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
22fe0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
22ff0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23000 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
23010 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
23020 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
23030 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23040 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
23050 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
23060 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23070 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23080 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
23090 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
230a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
230b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
230c0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
230d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
230e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
230f0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
23100 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
23110 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23120 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23130 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
23140 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
23150 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
23160 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
23170 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
23180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23190 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
231a0 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
231b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
231c0 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
231d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
231e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
231f0 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
23200 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23230 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23240 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
23250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23260 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
23270 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
23280 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
23290 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
232a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
232b0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
232c0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
232d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
232e0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
232f0 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
23300 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
23310 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
23320 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
23330 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23340 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
23350 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
23360 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
23370 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
23380 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
23390 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
233a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
233b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
233e0 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
233f0 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
23400 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
23410 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
23420 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23430 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23440 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
23450 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
23460 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
23470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23480 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23490 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
234a0 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
234b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
234c0 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
234d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
234e0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
234f0 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
23500 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
23510 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
23520 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
23530 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
23540 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
23550 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
23560 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23570 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
23580 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
23590 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
235c0 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
235d0 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
235e0 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
235f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
23600 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
23610 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23620 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
23630 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23640 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23650 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
23660 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
23670 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
23680 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
23690 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
236a0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
236b0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  time..**.** If r
236c0 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74  egDest>=0 then t
236d0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
236e0 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ays stored in th
236f0 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  at register and 
23700 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  the.** result is
23710 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20   not reusable.  
23720 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65  If regDest<0 the
23730 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23740 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74  s free to .** st
23750 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68  ore the value wh
23760 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73  ereever it wants
23770 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
23780 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
23790 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72  sion .** is stor
237a0 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ed is returned. 
237b0 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c   When regDest<0,
237c0 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65   two identical e
237d0 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a  xpressions will.
237e0 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73  ** code to the s
237f0 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  ame register..*/
23800 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23810 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
23820 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23830 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23840 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
23850 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
23860 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
23870 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
23880 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
23890 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20  .  int regDest  
238a0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
238b0 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
238c0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
238d0 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
238e0 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
238f0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
23900 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
23910 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28  ConstExpr;.  if(
23920 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20   regDest<0 && p 
23930 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
23940 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
23950 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  em;.    int i;. 
23960 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
23970 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
23980 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
23990 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
239a0 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
239b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
239c0 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70  re(0,pItem->pExp
239d0 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
239e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
239f0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
23a00 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d  ExprReg;.      }
23a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
23a20 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23a30 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
23a40 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
23a50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23a60 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23a70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
23a80 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
23a90 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23aa0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
23ab0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
23ac0 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
23ad0 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20  = regDest<0;.   
23ae0 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
23af0 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50  ) regDest = ++pP
23b00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
23b10 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
23b20 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
23b30 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  t;.  }.  pParse-
23b40 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
23b50 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73  .  return regDes
23b60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
23b70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
23b80 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
23b90 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
23ba0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
23bb0 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
23bc0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
23bd0 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
23be0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
23bf0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
23c00 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
23c10 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
23c20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
23c30 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
23c40 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
23c50 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
23c60 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
23c70 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
23c80 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
23c90 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
23ca0 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
23cb0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
23cc0 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
23cd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
23ce0 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
23cf0 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
23d00 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
23d10 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
23d20 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
23d30 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
23d40 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
23d50 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
23d60 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
23d70 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
23d80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
23d90 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
23da0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23db0 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
23dc0 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
23dd0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
23de0 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
23df0 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
23e00 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
23e10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
23e20 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
23e30 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
23e40 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
23e50 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20    ){.    *pReg  
23e60 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  = 0;.    r2 = sq
23e70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23e80 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
23e90 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, -1);.  }else{
23ea0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
23eb0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
23ec0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
23ed0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23ee0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
23ef0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
23f00 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
23f10 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
23f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23f30 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23f40 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
23f50 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
23f60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
23f70 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
23f80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23f90 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
23fa0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
23fb0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
23fc0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
23fd0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
23fe0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
23ff0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24000 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24010 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24020 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24030 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
24040 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24050 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24060 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
24070 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24080 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
24090 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
240a0 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
240b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
240c0 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
240d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
240e0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
240f0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
24100 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
24110 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
24120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24130 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24140 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24150 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24160 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
24170 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
24180 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
24190 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
241a0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
241b0 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
241c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
241d0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
241e0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
241f0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
24200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
24210 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
24220 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
24230 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
24240 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
24250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
24260 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
24270 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
24280 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
24290 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
242a0 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
242b0 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
242c0 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
242d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
242e0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
242f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24300 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24310 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
24320 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24330 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
24340 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
24350 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
24360 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
24370 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
24380 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
24390 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
243a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
243b0 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
243c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
243d0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
243e0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
243f0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
24400 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
24410 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
24420 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
24430 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
24440 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
24450 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24460 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
24470 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
24480 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
24490 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
244a0 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
244b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
244c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
244d0 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
244e0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
244f0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
24500 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24510 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
24520 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
24530 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
24540 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
24550 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
24560 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
24570 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
24580 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
24590 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
245a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
245b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
245c0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
245d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
245e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
245f0 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e  luates the given
24600 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
24610 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
24620 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24630 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
24640 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
24650 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24660 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
24670 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
24680 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
24690 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
246a0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
246b0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
246c0 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
246d0 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
246e0 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
246f0 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
24700 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
24710 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
24720 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
24730 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
24740 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
24750 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
24760 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
24770 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24780 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
24790 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
247a0 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
247b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
247c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
247d0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
247e0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
247f0 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
24800 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24810 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
24820 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24830 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
24840 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24850 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24860 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
24870 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24890 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
248a0 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
248b0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
248c0 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f  xpr, iMem);.}../
248d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
248e0 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
248f0 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
24900 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
24910 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
24920 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
24930 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
24940 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
24950 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
24960 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
24970 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
24980 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20  evaluated.  The 
24990 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
249a0 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20  will.** usually 
249b0 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  be pList->nExpr 
249c0 62 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64  but might be red
249d0 75 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45  uced if SQLITE_E
249e0 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69  CEL_OMITREF.** i
249f0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  s defined..**.**
24a00 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24a10 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e  _DUP flag preven
24a20 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ts the arguments
24a30 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66   from being.** f
24a40 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  illed using OP_S
24a50 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d  Copy.  OP_Copy m
24a60 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
24a70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
24a80 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
24a90 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77  R argument allow
24aa0 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  s constant argum
24ab0 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61  ents to be.** fa
24ac0 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20  ctored out into 
24ad0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
24ae0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ode..**.** The S
24af0 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66  QLITE_ECEL_REF f
24b00 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65  lag means that e
24b10 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
24b20 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45  e list with.** E
24b30 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e  xprList.a[].u.x.
24b40 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61  iOrderByCol>0 ha
24b50 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
24b60 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74  evaluated and st
24b70 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73  ored.** in regis
24b80 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20  ters at srcReg, 
24b90 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65  and so the value
24ba0 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66   can be copied f
24bb0 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66  rom there..** If
24bc0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
24bd0 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74  TREF is also set
24be0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
24bf0 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65  s with u.x.iOrde
24c00 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20  rByCol>0.** are 
24c10 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72  simply omitted r
24c20 61 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67  ather than being
24c30 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63   copied from src
24c40 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Reg..*/.int sqli
24c50 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
24c60 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
24c70 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
24c80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
24c90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
24ca0 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
24cb0 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
24cc0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
24cd0 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
24ce0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
24cf0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
24d00 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
24d10 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
24d20 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
24d30 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
24d40 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
24d50 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
24d60 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
24d70 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24d80 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
24d90 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
24da0 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
24db0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
24dc0 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
24dd0 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
24de0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
24df0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
24e00 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
24e10 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
24e20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
24e30 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
24e40 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
24e50 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
24e60 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
24e70 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
24e80 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
24e90 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
24ea0 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
24eb0 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
24ec0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
24ed0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
24ee0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
24ef0 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
24f00 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr;.#ifdef SQLIT
24f10 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
24f20 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
24f30 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65  f( pItem->bSorte
24f40 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d  rRef ){.      i-
24f50 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  -;.      n--;.  
24f60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
24f70 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
24f80 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
24f90 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65  !=0 && (j = pIte
24fa0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
24fb0 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ol)>0 ){.      i
24fc0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
24fd0 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29  E_ECEL_OMITREF )
24fe0 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20  {.        i--;. 
24ff0 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
25000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25020 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b  p2(v, copyOp, j+
25030 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74  srcReg-1, target
25040 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
25050 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
25060 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25070 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20  FACTOR)!=0.     
25080 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
25090 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
250a0 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20  tJoin(pExpr).   
250b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
250c0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
250d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
250e0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65  arget+i);.    }e
250f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
25100 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
25110 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
25120 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25130 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
25140 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
25150 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
25160 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
25170 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f   if( copyOp==OP_
25180 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
25190 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62   (pOp=sqlite3Vdb
251a0 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e  eGetOp(v, -1))->
251b0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a  opcode==OP_Copy.
251c0 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
251d0 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69  >p1+pOp->p3+1==i
251e0 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
251f0 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
25200 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20  +1==target+i.   
25210 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25220 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
25230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25240 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25250 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
25260 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
25270 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +i);.        }. 
25280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25290 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
252a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
252b0 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
252c0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
252d0 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
252e0 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
252f0 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
25300 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
25310 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
25320 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
25330 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
25340 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
25350 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
25360 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e  n.** elimination
25370 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   of x..**.** The
25380 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74   xJumpIf paramet
25390 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65  er determines de
253a0 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
253b0 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  NULL:           
253c0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
253d0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
253e0 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a   in reg[dest].**
253f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25400 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70  fTrue:      Jump
25410 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65   to dest if true
25420 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78  .**    sqlite3Ex
25430 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a  prIfFalse:     J
25440 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66  ump to dest if f
25450 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  alse.**.** The j
25460 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65  umpIfNull parame
25470 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
25480 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c  f xJumpIf is NUL
25490 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
254a0 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
254b0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
254c0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
254d0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
254e0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
254f0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
25500 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
25510 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
25520 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
25530 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
25540 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f  stination or sto
25550 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f  rage location */
25560 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29  .  void (*xJump)
25570 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
25580 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f  t,int), /* Actio
25590 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69  n to take */.  i
255a0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
255b0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
255c0 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
255d0 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
255e0 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
255f0 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
25600 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
25610 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
25620 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
25630 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
25640 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
25650 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
25660 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
25670 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
25680 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
25690 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
256a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
256b0 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
256c0 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
256d0 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  ...  memset(&com
256e0 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pLeft, 0, sizeof
256f0 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25700 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c  t(&compRight, 0,
25710 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
25720 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e    memset(&exprAn
25730 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  d, 0, sizeof(Exp
25740 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r));..  assert( 
25750 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
25760 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
25770 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
25780 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
25790 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
257a0 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
257b0 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
257c0 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
257d0 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
257e0 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
257f0 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
25800 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
25810 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
25820 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
25830 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
25840 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
25850 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
25860 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
25870 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
25880 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
25890 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
258a0 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
258b0 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
258c0 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  prX, exprCodeVec
258d0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70  tor(pParse, &exp
258e0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
258f0 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a  .  if( xJump ){.
25900 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65      xJump(pParse
25910 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
25920 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
25940 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  ark the expressi
25950 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d  on is being from
25960 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
25970 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
25980 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  n.    ** so that
25990 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   the sqlite3Expr
259a0 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75  CodeTarget() rou
259b0 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  tine will not at
259c0 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20  tempt to move.  
259d0 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65    ** it into the
259e0 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70   Parse.pConstExp
259f0 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75  r list.  We shou
25a00 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74  ld use a new bit
25a10 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a   for this,.    *
25a20 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62  * for clarity, b
25a30 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66  ut we are out of
25a40 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70   bits in the Exp
25a50 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f  r.flags field so
25a60 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   we.    ** have 
25a70 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f  to reuse the EP_
25a80 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42  FromJoin bit.  B
25a90 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78  ummer. */.    ex
25aa0 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  prX.flags |= EP_
25ab0 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71  FromJoin;.    sq
25ac0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25ad0 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70  get(pParse, &exp
25ae0 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d  rAnd, dest);.  }
25af0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
25b00 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
25b10 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
25b20 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
25b30 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
25b40 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  */.  testcase( x
25b50 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25b60 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
25b70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
25b80 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
25b90 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25ba0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25bb0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
25bc0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
25bd0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25be0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25bf0 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25c00 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
25c10 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
25c20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25c30 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
25c40 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
25c50 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
25c60 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
25c70 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25c80 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
25c90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
25ca0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25cb0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25cc0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25cd0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25ce0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
25cf0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
25d00 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25d10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
25d20 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
25d30 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
25d40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25d50 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25d60 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
25d70 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
25d80 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
25d90 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20  tcase( xJump==0 
25da0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
25db0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
25dc0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
25dd0 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
25de0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
25df0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
25e00 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
25e10 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
25e20 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
25e30 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
25e40 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
25e50 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
25e60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
25e70 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
25e80 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
25e90 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
25ea0 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
25eb0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
25ec0 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
25ed0 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
25ee0 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
25ef0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
25f00 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
25f10 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
25f20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
25f30 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
25f40 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
25f50 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
25f60 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
25f70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
25f80 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
25f90 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
25fa0 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
25fb0 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
25fc0 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
25fd0 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
25fe0 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
25ff0 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
26000 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
26010 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
26020 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
26030 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
26040 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
26050 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
26060 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
26070 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
26080 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
26090 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
260a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
260b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
260c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
260d0 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
260e0 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
260f0 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
26100 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
26110 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
26120 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
26130 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
26140 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
26150 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
26160 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
26170 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
26180 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
26190 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
261a0 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
261b0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
261c0 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
261d0 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
261e0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
261f0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
26200 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
26210 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26230 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26240 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26250 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26260 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
26270 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
26280 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
26290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
262a0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
262b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
262c0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
262d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
262e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
262f0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
26300 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26310 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
26320 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26330 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26350 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26360 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26370 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26380 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26390 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
263a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
263b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
263c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
263d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
263e0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
263f0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26400 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
26410 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26420 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26430 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
26440 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26450 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26460 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
26470 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
26480 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f  t;      /* IS NO
26490 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  T TRUE or IS NOT
264a0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
264b0 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 20  int isTrue;     
264c0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
264d0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
264e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
264f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26500 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
26510 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
26520 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
26530 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
26540 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
26550 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
26560 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
26570 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
26580 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
26590 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
265a0 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
265b0 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
265c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
265d0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
265e0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
26610 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
26620 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
26630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
26640 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26650 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26660 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
26690 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
266a0 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
266b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
266c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
266d0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
266e0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
266f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
26700 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
26710 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
26720 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
26730 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
26740 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
26750 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
26760 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
26770 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
26780 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
26790 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
267a0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
267b0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
267c0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
267d0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
267e0 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
267f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
26800 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
26810 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
26820 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
26830 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26840 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
26850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26860 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26870 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26880 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
26890 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
268a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
268b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
268c0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
268d0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
268e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
268f0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
26900 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
26910 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
26920 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26930 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26940 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
26950 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
26960 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26970 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
26980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26990 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
269a0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
269b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
269c0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
269d0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
269e0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
269f0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
26a00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26a10 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
26a20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
26a30 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
26a40 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
26a50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26a60 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
26a70 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
26a80 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
26a90 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
26aa0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26ab0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
26ac0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
26ad0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
26ae0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26af0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
26b00 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
26b10 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26b20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
26b30 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
26b40 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
26b50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26b60 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26b70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26b80 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26b90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26ba0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
26bb0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
26bc0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
26bd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26be0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26bf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26c00 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
26c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26c20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
26c30 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
26c40 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
26c50 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
26c60 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
26c70 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
26c80 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
26c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
26ca0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
26cb0 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
26cc0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
26cd0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
26ce0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26cf0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26d00 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
26d10 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
26d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26d30 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
26d40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26d50 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
26d60 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
26d70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26d80 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
26d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26da0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26dc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
26dd0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
26de0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26df0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26e00 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26e10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26e20 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
26e30 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
26e40 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
26e50 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
26e60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26e70 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
26e80 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
26e90 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
26ea0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26eb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
26ec0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
26ed0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
26ee0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
26ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26f00 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
26f10 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
26f20 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
26f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26f40 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
26f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26f60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26f70 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
26f80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26f90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
26fa0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
26fb0 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
26fc0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
26fd0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
26fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26ff0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
27000 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27010 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
27020 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
27030 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
27040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27050 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27060 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27070 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
27080 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
27090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
270a0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
270b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
270c0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
270d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
270e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
270f0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27100 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27110 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27130 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
27140 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27150 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27160 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
27170 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
27180 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
27190 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
271a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
271b0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
271c0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
271d0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
271e0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
271f0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
27200 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
27210 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
27220 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
27230 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
27240 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
27250 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
27260 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27270 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
27280 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
27290 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
272a0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
272b0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
272c0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
272d0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
272e0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
272f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27300 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
27310 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
27320 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
27330 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
27340 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
27350 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
27360 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
27370 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
27380 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
27390 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
273a0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
273b0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
273c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
273d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
273e0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
273f0 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
27400 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
27410 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
27420 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
27430 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
27440 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
27450 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
27460 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
27470 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
27480 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
27490 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
274a0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
274b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
274c0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
274d0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
274e0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
274f0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
27500 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
27510 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
27520 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27540 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
27550 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
27560 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
27570 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
27580 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
27590 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
275a0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
275b0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
275d0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
275e0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
275f0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
27600 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
27610 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
27620 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
27630 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
27640 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
27650 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27660 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27670 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27680 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27690 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
276a0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
276b0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
276c0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
276d0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
276e0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
276f0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
27700 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
27710 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
27720 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
27730 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
27740 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
27750 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27760 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27770 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27780 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27790 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
277a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
277b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
277c0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
277d0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
277e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
277f0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
27800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27810 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
27820 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
27830 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27840 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
27850 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
27860 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27870 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27890 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
278a0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
278b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
278c0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
278d0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
278e0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
278f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27900 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27910 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27920 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27930 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27940 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27950 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27960 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27970 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27980 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27990 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
279a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
279b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
279c0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
279d0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
279e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
279f0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
27a00 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27a10 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27a20 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27a40 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
27a50 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
27a60 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
27a70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27a80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27a90 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
27aa0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27ac0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
27ad0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27ae0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27af0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
27b00 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27b10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
27b20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
27b30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27b40 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
27b50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27b70 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
27b80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
27b90 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54  t;   /* IS NOT T
27ba0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
27bb0 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
27bc0 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20   isTrue;  /* IS 
27bd0 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
27be0 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
27bf0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27c00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
27c10 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
27c20 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
27c30 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
27c40 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
27c50 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
27c60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27c70 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
27c80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27c90 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
27ca0 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
27cb0 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
27cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
27cd0 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f  S TRUE and IS NO
27ce0 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
27cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27d00 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27d10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
27d40 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
27d50 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20  JUMPIFNULL);..  
27d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d70 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61     /* IS FALSE a
27d80 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  nd IS NOT TRUE *
27d90 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
27da0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27db0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27dc0 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
27df0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27e10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27e20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
27e30 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
27e40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27e50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
27e60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27e70 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
27e80 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
27e90 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
27ea0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
27eb0 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
27ec0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
27ed0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
27ee0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
27ef0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
27f00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
27f10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
27f20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
27f30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
27f40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
27f50 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
27f60 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
27f70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
27f80 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
27f90 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
27fa0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27fb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
27fc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27fd0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27fe0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
27ff0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
28000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28010 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28020 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
28030 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
28040 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
28050 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28060 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28070 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
28080 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
28090 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
280a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
280b0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
280c0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
280d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
280e0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
280f0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
28100 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
28110 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
28120 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28130 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
28140 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
28150 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
28160 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
28170 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
28180 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
28190 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
281a0 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
281b0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
281c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
281d0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
281e0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
281f0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
28200 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
28210 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28220 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28230 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
28240 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28250 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28260 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
28270 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
28280 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28290 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
282a0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
282b0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
282c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
282d0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
282e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
282f0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28300 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28310 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28320 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
28330 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28340 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28350 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
28360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28370 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
28380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28390 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
283a0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
283b0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
283c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
283d0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
283e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
283f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28410 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28420 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
28430 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
28440 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
28450 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
28460 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
28470 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28480 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
28490 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
284a0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
284b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
284c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
284d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
284e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
284f0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28500 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28510 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28520 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28540 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28550 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
28560 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
28570 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
28580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28590 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
285a0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
285b0 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
285c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
285d0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
285e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
285f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28600 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28610 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
28620 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28630 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
28640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28650 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28660 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
28670 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28680 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28690 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
286a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
286b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
286c0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
286d0 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
286e0 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
286f0 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
28700 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28710 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28720 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28730 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
28740 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
28750 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28760 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
28770 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
28780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28790 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
287a0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
287b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
287c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
287d0 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
287e0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
287f0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28800 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
28810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28820 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28840 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28860 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
28870 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28880 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
28890 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
288a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
288b0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
288c0 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
288d0 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
288e0 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
288f0 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
28900 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
28910 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
28920 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
28930 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
28940 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
28950 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
28960 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
28970 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
28980 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
28990 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
289a0 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
289b0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
289c0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
289d0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
289e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
289f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
28a00 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
28a10 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
28a20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
28a30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28a40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
28a50 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28a60 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
28a70 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28a80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
28a90 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
28aa0 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  py);.}../*.** Ex
28ab0 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73  pression pVar is
28ac0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28ad0 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  e an SQL variabl
28ae0 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20  e. pExpr may be 
28af0 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65  any.** type of e
28b00 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
28b10 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
28b20 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
28b30 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  - an integer, re
28b40 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62  al, string, blob
28b50 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  .** or NULL valu
28b60 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42  e - then the VDB
28b70 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  E currently bein
28b80 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f  g prepared is co
28b90 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72  nfigured.** to r
28ba0 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74  e-prepare each t
28bb0 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ime a new value 
28bc0 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  is bound to vari
28bd0 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a  able pVar..**.**
28be0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
28bf0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
28c00 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e  ple SQL value an
28c10 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  d the value is t
28c20 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68  he.** same as th
28c30 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75  at currently bou
28c40 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
28c50 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  Var, non-zero is
28c60 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
28c70 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
28c80 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74  values are not t
28c90 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45  he same or if pE
28ca0 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  xpr is not a sim
28cb0 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65  ple.** SQL value
28cc0 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
28cd0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
28ce0 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  t exprCompareVar
28cf0 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  iable(Parse *pPa
28d00 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c  rse, Expr *pVar,
28d10 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
28d20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
28d30 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69  int iVar;.  sqli
28d40 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a  te3_value *pL, *
28d50 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c  pR = 0;.  .  sql
28d60 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
28d70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
28d80 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
28d90 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
28da0 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70  B, &pR);.  if( p
28db0 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20  R ){.    iVar = 
28dc0 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pVar->iColumn;. 
28dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
28de0 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
28df0 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
28e00 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56     pL = sqlite3V
28e10 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
28e20 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
28e30 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54  are, iVar, SQLIT
28e40 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20  E_AFF_BLOB);.   
28e50 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20   if( pL ){.     
28e60 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
28e70 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c  ue_type(pL)==SQL
28e80 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
28e90 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
28ea0 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d  e_text(pL); /* M
28eb0 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63  ake sure the enc
28ec0 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a  oding is UTF-8 *
28ed0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
28ee0 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65  res =  0==sqlite
28ef0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20  3MemCompare(pL, 
28f00 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pR, 0);.    }.  
28f10 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
28f20 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69  ee(pR);.    sqli
28f30 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29  te3ValueFree(pL)
28f40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
28f50 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  res;.}../*.** Do
28f60 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
28f70 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
28f80 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
28f90 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
28fa0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
28fb0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
28fc0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
28fd0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
28fe0 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
28ff0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
29000 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
29010 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
29020 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
29030 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
29040 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
29050 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
29060 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
29070 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
29080 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
29090 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
290a0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
290b0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
290c0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
290d0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
290e0 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
290f0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
29100 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
29110 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
29120 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
29130 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
29140 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
29150 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
29160 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
29170 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
29180 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
29190 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
291a0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
291b0 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
291c0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
291d0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
291e0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
291f0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
29200 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
29210 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
29220 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
29230 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
29240 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
29250 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
29260 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
29270 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
29280 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
29290 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
292a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
292b0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
292c0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
292d0 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
292e0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
292f0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
29300 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
29310 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
29320 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
29330 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
29340 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
29350 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
29360 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
29370 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
29380 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
29390 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
293a0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
293b0 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
293c0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
293d0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   malfunction..**
293e0 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
293f0 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54   not NULL then T
29400 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73  K_VARIABLE terms
29410 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64   in pA with bind
29420 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73  ings in.** pPars
29430 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61  e->pReprepare ca
29440 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  n be matched aga
29450 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e  inst literals in
29460 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50   pB.  The .** pP
29470 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
29480 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20  mask bitmask is 
29490 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68  updated for each
294a0 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
294b0 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72  nced..** If pPar
294c0 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20  se is NULL (the 
294d0 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65  normal case) the
294e0 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  n any TK_VARIABL
294f0 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72  E term in .** Ar
29500 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68  gument pParse sh
29510 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
29520 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
29530 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20  not NULL and pA 
29540 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20  or.** pB causes 
29550 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  a return value o
29560 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 2..*/.int sqli
29570 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50  te3ExprCompare(P
29580 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
29590 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
295a0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
295b0 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
295c0 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
295d0 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
295e0 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
295f0 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  : 2;.  }.  if( p
29600 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d  Parse && pA->op=
29610 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20  =TK_VARIABLE && 
29620 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
29630 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20  ble(pParse, pA, 
29640 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pB) ){.    retur
29650 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  n 0;.  }.  combi
29660 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
29670 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
29680 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
29690 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
296a0 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
296b0 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
296c0 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
296d0 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
296e0 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
296f0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
29700 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
29710 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
29720 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
29730 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  p ){.    if( pA-
29740 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
29750 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
29760 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
29770 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29  ->pLeft,pB,iTab)
29780 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
29790 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
297a0 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pB->op==TK_C
297b0 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
297c0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
297d0 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66  rse, pA,pB->pLef
297e0 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  t,iTab)<2 ){.   
297f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
29800 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
29810 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
29820 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
29830 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pA->op!=TK_AGG_C
29840 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a  OLUMN && pA->u.z
29850 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
29860 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43   pA->op==TK_FUNC
29870 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  TION ){.      if
29880 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
29890 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
298a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
298b0 20 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64   return 2;.#ifnd
298c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
298d0 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
298e0 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
298f0 20 66 6f 72 20 74 68 65 20 61 73 73 65 72 74 28   for the assert(
29900 29 3a 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64  ):.      ** wind
29910 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ow functions hav
29920 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  e p->op==TK_FUNC
29930 54 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61  TION but aggrega
29940 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  te functions.   
29950 20 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70     ** have p->op
29960 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
29970 4e 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61  N.  So any compa
29980 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e  rison between an
29990 20 61 67 67 72 65 67 61 74 65 0a 20 20 20 20 20   aggregate.     
299a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64   ** function and
299b0 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
299c0 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  on should have f
299d0 61 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61  ailed before rea
299e0 63 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  ching.      ** t
299f0 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c  his point.  And,
29a00 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
29a10 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69  ble to have a wi
29a20 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ndow function an
29a30 64 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61  d.      ** a sca
29a40 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  lar function wit
29a50 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
29a60 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  and number of ar
29a70 67 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20  guments.  So.   
29a80 20 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63     ** if we reac
29a90 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69  h this point, ei
29aa0 74 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74  ther A and B bot
29ab0 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
29ac0 6e 73 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e  ns or.      ** n
29ad0 65 69 74 68 65 72 20 61 72 65 20 61 20 77 69 6e  either are a win
29ae0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  dow functions. *
29af0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
29b00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29b10 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d  pA,EP_WinFunc)==
29b20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29b30 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  pB,EP_WinFunc) )
29b40 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
29b50 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45  HasProperty(pA,E
29b60 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
29b70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29b80 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70  3WindowCompare(p
29b90 50 61 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e  Parse,pA->y.pWin
29ba0 2c 70 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20  ,pB->y.pWin)!=0 
29bb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
29bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
29bd0 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d  else if( pA->op=
29be0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
29bf0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29c00 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a  _stricmp(pA->u.z
29c10 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
29c20 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
29c30 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
29c40 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
29c50 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
29c60 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
29c70 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
29c80 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
29c90 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
29ca0 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
29cb0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
29cc0 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
29cd0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
29ce0 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
29cf0 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
29d00 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
29d10 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
29d20 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
29d30 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46    if( (combinedF
29d40 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 43  lags & EP_FixedC
29d50 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73  ol)==0.     && s
29d60 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29d70 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c  e(pParse, pA->pL
29d80 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
29d90 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
29da0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29db0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
29dc0 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c  rse, pA->pRight,
29dd0 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
29de0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
29df0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29e00 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
29e10 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
29e20 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
29e30 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73  return 2;.    as
29e40 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46  sert( (combinedF
29e50 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
29e60 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  d)==0 );.    if(
29e70 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
29e80 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  NG && pA->op!=TK
29e90 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20  _TRUEFALSE ){.  
29ea0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
29eb0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
29ec0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29ed0 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
29ee0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
29ef0 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
29f00 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
29f10 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
29f20 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
29f30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29f40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
29f50 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
29f60 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
29f70 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
29f80 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
29f90 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
29fa0 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
29fb0 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
29fc0 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29fd0 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29fe0 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29ff0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
2a000 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
2a010 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
2a020 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
2a030 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
2a040 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
2a050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
2a060 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
2a070 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
2a080 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
2a090 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
2a0a0 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
2a0b0 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
2a0c0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
2a0d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
2a0e0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
2a0f0 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
2a100 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
2a110 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
2a120 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
2a130 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
2a140 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
2a150 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
2a160 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
2a170 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
2a180 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
2a190 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
2a1a0 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
2a1b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a1c0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2a1d0 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
2a1e0 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
2a1f0 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
2a200 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
2a210 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
2a220 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
2a230 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
2a240 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
2a250 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
2a260 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
2a270 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
2a280 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
2a290 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
2a2a0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
2a2b0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
2a2c0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2a2d0 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
2a2e0 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
2a2f0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2a300 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
2a310 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a320 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45  re(0, pExprA, pE
2a330 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
2a340 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a350 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a360 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
2a370 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70  rCompare() excep
2a380 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  t COLLATE operat
2a390 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c  ors at the top-l
2a3a0 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f  evel.** are igno
2a3b0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2a3c0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b  te3ExprCompareSk
2a3d0 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  ip(Expr *pA, Exp
2a3e0 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
2a3f0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2a400 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2a410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2a420 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2a430 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20  late(pA),.      
2a440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a450 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42  prSkipCollate(pB
2a460 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a470 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
2a480 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
2a490 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
2a4a0 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
2a4b0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
2a4c0 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
2a4d0 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
2a4e0 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
2a4f0 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
2a500 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
2a510 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
2a520 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
2a530 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
2a540 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2a550 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2a560 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
2a570 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2a580 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2a590 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2a5a0 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
2a5b0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
2a5c0 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
2a5d0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2a5e0 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
2a5f0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2a600 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2a610 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
2a620 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2a630 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2a640 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2a650 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
2a660 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2a670 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
2a680 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
2a690 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
2a6a0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2a6b0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
2a6c0 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
2a6d0 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
2a6e0 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
2a6f0 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
2a700 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
2a710 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
2a720 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
2a730 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
2a740 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a750 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2a760 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
2a770 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  nd variables in 
2a780 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70  pE1 are .** comp
2a790 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74  ared against lit
2a7a0 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70  eral values in p
2a7b0 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70  E2 and pParse->p
2a7c0 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73  Vdbe->expmask is
2a7d0 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20  .** modified to 
2a7e0 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75  record which bou
2a7f0 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  nd variables are
2a800 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66   referenced.  If
2a810 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e   pParse .** is N
2a820 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20  ULL, then false 
2a830 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a840 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73   if pE1 contains
2a850 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61   any bound varia
2a860 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
2a870 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
2a880 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
2a890 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
2a8a0 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
2a8b0 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
2a8c0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
2a8d0 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
2a8e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
2a8f0 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
2a900 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
2a910 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
2a920 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
2a930 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
2a940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a950 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61  prImpliesExpr(Pa
2a960 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2a970 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
2a980 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
2a990 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a9a0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a9b0 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
2a9c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a9d0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2a9e0 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
2a9f0 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
2aa00 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2aa10 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  , pE1, pE2->pLef
2aa20 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
2aa30 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2aa40 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2aa50 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2aa60 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2aa70 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2aa80 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2aa90 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
2aaa0 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2aab0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
2aac0 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
2aad0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
2aae0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2aaf0 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
2ab00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2ab10 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
2ab20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ab30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2ab40 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65  se, pX, pE2->pLe
2ab50 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
2ab60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2ab70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2ab80 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78  * This is the Ex
2ab90 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  pr node callback
2aba0 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
2abb0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  ImpliesNotNullRo
2abc0 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  w()..** If the e
2abd0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
2abe0 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
2abf0 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65   table at pWalke
2ac00 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20  r->iCur.** have 
2ac10 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d  one or more non-
2ac20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  NULL column, the
2ac30 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65  n set pWalker->e
2ac40 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62  Code to 1 and ab
2ac50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ort..**.** This 
2ac60 72 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73  routine controls
2ac70 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2ac80 2e 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76  .  False positiv
2ac90 65 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70  es (setting.** p
2aca0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
2acb0 20 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c   1 when it shoul
2acc0 64 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65  d not be) are de
2acd0 61 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d  adly, but false-
2ace0 6e 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65  negatives.** (ne
2acf0 76 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c  ver setting pWal
2ad00 6b 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61  ker->eCode) is a
2ad10 20 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64   harmless missed
2ad20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
2ad30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70  /.static int imp
2ad40 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57  liesNotNullRow(W
2ad50 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2ad60 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2ad70 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2ad80 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2ad90 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  MN );.  testcase
2ada0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2adb0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2adc0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2add0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2ade0 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
2adf0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2ae00 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2ae10 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2ae20 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  _ISNOT:.    case
2ae30 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73   TK_NOT:.    cas
2ae40 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
2ae50 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
2ae60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
2ae70 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20   case TK_CASE:. 
2ae80 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
2ae90 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
2aea0 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ION:.      testc
2aeb0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2aec0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
2aed0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2aee0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  r->op==TK_NOT );
2aef0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2af00 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2af10 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
2af20 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2af30 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
2af40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2af50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
2af60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2af70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2af80 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASE );.      tes
2af90 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2afa0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==TK_IN );.     
2afb0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2afc0 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
2afd0 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N );.      retur
2afe0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2aff0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2b000 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
2b010 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70  er->u.iCur==pExp
2b020 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  r->iTable ){.   
2b030 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
2b040 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2b050 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b060 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b070 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b080 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75  e;..    /* Virtu
2b090 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c  al tables are al
2b0a0 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e  lowed to use con
2b0b0 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d  straints like x=
2b0c0 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  NULL.  So.    **
2b0d0 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
2b0e0 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74  orm x=y does not
2b0f0 20 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73   prove that y is
2b100 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20   not null if x. 
2b110 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c     ** is the col
2b120 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c  umn of a virtual
2b130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61   table */.    ca
2b140 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
2b150 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
2b160 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
2b170 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
2b180 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
2b190 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
2b1a0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b1b0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
2b1c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b1d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
2b1e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b1f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b200 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
2b210 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b220 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
2b230 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b240 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20  >op==TK_GT );.  
2b250 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b260 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29  xpr->op==TK_GE )
2b270 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78  ;.      if( (pEx
2b280 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
2b290 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2b2a0 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65  rtual(pExpr->pLe
2b2b0 66 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20  ft->y.pTab)).   
2b2c0 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70      || (pExpr->p
2b2d0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
2b2e0 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61  LUMN && IsVirtua
2b2f0 6c 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  l(pExpr->pRight-
2b300 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2b310 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  ){.       return
2b320 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2b330 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
2b340 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2b350 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
2b360 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2b370 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
2b380 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2b390 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  can only be true
2b3a0 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20   if at least.** 
2b3b0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
2b3c0 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d  ble iTab is non-
2b3d0 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  null.  In other 
2b3e0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72  words, return tr
2b3f0 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73  ue.** if express
2b400 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79  ion p will alway
2b410 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c  s be NULL or fal
2b420 73 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75  se if every colu
2b430 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2b440 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c   NULL..**.** Fal
2b450 73 65 20 6e 65 67 61 74 69 76 65 73 20 61 72 65  se negatives are
2b460 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e   acceptable.  In
2b470 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
2b480 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e   is ok to return
2b490 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66  .** zero even if
2b4a0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2b4b0 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
2b4c0 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   of every column
2b4d0 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2b4e0 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  ULL.  A false ne
2b4f0 67 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79  gative is merely
2b500 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69   a missed optimi
2b510 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69  zation opportuni
2b520 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  ty..**.** False 
2b530 70 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f  positives are no
2b540 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76  t allowed, howev
2b550 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  er.  A false pos
2b560 69 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74  itive may result
2b570 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  .** in an incorr
2b580 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a  ect answer..**.*
2b590 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61  * Terms of p tha
2b5a0 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74  t are marked wit
2b5b0 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61  h EP_FromJoin (a
2b5c0 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f  nd hence that co
2b5d0 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f  me from.** the O
2b5e0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2b5f0 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53  es of LEFT JOINS
2b600 29 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 66  ) are excluded f
2b610 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73  rom the analysis
2b620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2b630 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
2b640 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20  check if a LEFT 
2b650 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76  JOIN can be conv
2b660 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e  erted into.** an
2b670 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20   ordinary JOIN. 
2b680 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20   The p argument 
2b690 69 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  is the WHERE cla
2b6a0 75 73 65 2e 20 20 49 66 20 74 68 65 20 57 48 45  use.  If the WHE
2b6b0 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71  RE.** clause req
2b6c0 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20  uires that some 
2b6d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69  column of the ri
2b6e0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ght table of the
2b6f0 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65   LEFT JOIN.** be
2b700 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
2b710 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  the LEFT JOIN ca
2b720 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76  n be safely conv
2b730 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a  erted into an.**
2b740 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a   ordinary join..
2b750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b760 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
2b770 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  Row(Expr *p, int
2b780 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72   iTab){.  Walker
2b790 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2b7a0 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e  lback = impliesN
2b7b0 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78  otNullRow;.  w.x
2b7c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2b7d0 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   0;.  w.xSelectC
2b7e0 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
2b7f0 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77  w.eCode = 0;.  w
2b800 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  .u.iCur = iTab;.
2b810 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2b820 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
2b830 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
2b840 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2b850 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2b860 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2b870 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2b880 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74  walker.** to det
2b890 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70  ermine if an exp
2b8a0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65  ression can be e
2b8b0 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65  valuated by refe
2b8c0 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20  rence to the.** 
2b8d0 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68  index only, with
2b8e0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  out having to do
2b8f0 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68   a search for th
2b900 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
2b910 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
2b920 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49   The IdxCover.pI
2b930 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20  dx field is the 
2b940 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72  index.  IdxCover
2b950 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20  .iCur.** is the 
2b960 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
2b970 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
2b980 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64  IdxCover {.  Ind
2b990 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a  ex *pIdx;     /*
2b9a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
2b9b0 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65   tested for cove
2b9c0 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  rage */.  int iC
2b9d0 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ur;        /* Cu
2b9e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2b9f0 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73  the table corres
2ba00 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69  ponding to the i
2ba10 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ndex */.};../*.*
2ba20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2ba30 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65  f there are refe
2ba40 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2ba50 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70  s in table .** p
2ba60 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2ba70 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65  ver->iCur can be
2ba80 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
2ba90 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57   the index.** pW
2baa0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2bab0 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  er->pIdx..*/.sta
2bac0 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43  tic int exprIdxC
2bad0 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  over(Walker *pWa
2bae0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2baf0 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
2bb00 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
2bb10 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
2bb20 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  le==pWalker->u.p
2bb30 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20  IdxCover->iCur. 
2bb40 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75    && sqlite3Colu
2bb50 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65  mnOfIndex(pWalke
2bb60 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2bb70 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pIdx, pExpr->iCo
2bb80 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20  lumn)<0.  ){.   
2bb90 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2bba0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2bbb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
2bbc0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2bbd0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
2bbe0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69  etermine if an i
2bbf0 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62  ndex pIdx on tab
2bc00 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
2bc10 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c  Cur contains wil
2bc20 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  l.** the express
2bc30 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75  ion pExpr.  Retu
2bc40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
2bc50 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20  ndex does cover 
2bc60 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2bc70 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  n and false if t
2bc80 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
2bc90 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74  ion references t
2bca0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  able columns.** 
2bcb0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75  that are not fou
2bcc0 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nd in the index 
2bcd0 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  pIdx..**.** An i
2bce0 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e  ndex covering an
2bcf0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e   expression mean
2bd00 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
2bd10 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20  ssion can be.** 
2bd20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20  evaluated using 
2bd30 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61  only the index a
2bd40 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  nd without havin
2bd50 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a  g to lookup the.
2bd60 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2bd70 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f   table entry..*/
2bd80 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2bd90 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a  CoveredByIndex(.
2bda0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
2bdb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2bdc0 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
2bdd0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2bde0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bdf0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2be00 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
2be10 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49  ing table */.  I
2be20 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2be30 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2be40 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73  that might be us
2be50 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
2be60 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  */.){.  Walker w
2be70 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f  ;.  struct IdxCo
2be80 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73  ver xcov;.  mems
2be90 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
2bea0 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75  (w));.  xcov.iCu
2beb0 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76  r = iCur;.  xcov
2bec0 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
2bed0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2bee0 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a  = exprIdxCover;.
2bef0 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20    w.u.pIdxCover 
2bf00 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74  = &xcov;.  sqlit
2bf10 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2bf20 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  Expr);.  return 
2bf30 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a  !w.eCode;.}.../*
2bf40 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2bf50 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2bf60 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2bf70 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2bf80 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e  alker.** to coun
2bf90 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  t references to 
2bfa0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
2bfb0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f   the arguments o
2bfc0 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61  f an .** aggrega
2bfd0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20  te function, in 
2bfe0 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
2bff0 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  nt the.** sqlite
2c000 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63  3FunctionThisSrc
2c010 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
2c020 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b  truct SrcCount {
2c030 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2c040 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69  ;   /* One parti
2c050 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73  cular FROM claus
2c060 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75  e in a nested qu
2c070 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  ery */.  int nTh
2c080 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  is;       /* Num
2c090 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2c0a0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2c0b0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  pSrcList */.  in
2c0c0 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f  t nOther;      /
2c0d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
2c0e0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2c0f0 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20  s in other FROM 
2c100 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  clauses */.};../
2c110 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
2c120 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2c130 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a  ces to columns..
2c140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2c150 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65  prSrcCount(Walke
2c160 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2c170 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
2c180 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68  he NEVER() on th
2c190 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73  e second term is
2c1a0 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33   because sqlite3
2c1b0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2c1c0 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c  Src().  ** is al
2c1d0 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
2c1e0 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  re sqlite3ExprAn
2c1f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2c200 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a  ) and so the.  *
2c210 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76  * TK_COLUMNs hav
2c220 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
2c230 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
2c240 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66  _AGG_COLUMN.  If
2c250 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  .  ** sqlite3Fun
2c260 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2c270 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65  () is used diffe
2c280 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75  rently in the fu
2c290 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e  ture, the.  ** N
2c2a0 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64  EVER() will need
2c2b0 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20   to be removed. 
2c2c0 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
2c2d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
2c2e0 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70   NEVER(pExpr->op
2c2f0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
2c300 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2c310 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75     struct SrcCou
2c320 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  nt *p = pWalker-
2c330 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20  >u.pSrcCount;.  
2c340 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
2c350 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
2c360 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f  nt nSrc = pSrc ?
2c370 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b   pSrc->nSrc : 0;
2c380 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c390 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2c3a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2c3b0 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e  ble==pSrc->a[i].
2c3c0 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
2c3d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2c3e0 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  <nSrc ){.      p
2c3f0 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
2c400 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
2c410 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
2c420 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2c430 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2c440 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
2c450 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
2c460 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
2c470 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
2c480 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
2c490 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2c4a0 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
2c4b0 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
2c4c0 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
2c4d0 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
2c4e0 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
2c4f0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
2c500 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
2c510 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
2c520 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
2c530 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
2c540 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
2c550 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
2c560 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
2c570 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
2c580 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
2c590 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
2c5a0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
2c5b0 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
2c5c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
2c5d0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
2c5e0 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78  CTION );.  w.xEx
2c5f0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
2c600 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78  rSrcCount;.  w.x
2c610 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2c620 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f   0;.  w.u.pSrcCo
2c630 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
2c640 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
2c650 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
2c660 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
2c670 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
2c680 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
2c690 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
2c6a0 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
2c6b0 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
2c6c0 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
2c6d0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2c6e0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
2c6f0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
2c700 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
2c710 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
2c720 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
2c730 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2c740 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
2c750 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
2c760 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
2c770 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
2c780 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2c790 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2c7a0 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
2c7b0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
2c7c0 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
2c7d0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
2c7e0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2c7f0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
2c800 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
2c810 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
2c820 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
2c830 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
2c840 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2c850 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2c860 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
2c870 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
2c880 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
2c890 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
2c8a0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2c8b0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
2c8c0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
2c8d0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
2c8e0 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
2c8f0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
2c900 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
2c910 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
2c920 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2c930 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
2c940 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
2c950 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
2c960 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
2c970 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2c980 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
2c990 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
2c9a0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
2c9b0 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
2c9c0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
2c9d0 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
2c9e0 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
2c9f0 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
2ca00 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2ca10 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
2ca20 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2ca30 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
2ca40 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ca50 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
2ca60 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
2ca70 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
2ca80 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2ca90 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
2caa0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
2cab0 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
2cac0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
2cad0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
2cae0 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
2caf0 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
2cb00 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
2cb10 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
2cb20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66  pNC->uNC.pAggInf
2cb30 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  o;..  assert( pN
2cb40 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2cb50 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77  UAggInfo );.  sw
2cb60 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2cb70 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
2cb80 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
2cb90 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
2cba0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2cbb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2cbc0 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
2cbd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2cbe0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2cbf0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
2cc00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2cc10 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
2cc20 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
2cc30 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
2cc40 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2cc50 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2cc60 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
2cc70 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
2cc80 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
2cc90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2cca0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
2ccb0 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
2ccc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
2ccd0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
2cce0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2ccf0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2cd00 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
2cd10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2cd20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2cd30 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2cd40 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2cd50 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
2cd60 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2cd70 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2cd80 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
2cd90 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2cda0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
2cdb0 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
2cdc0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
2cdd0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2cde0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
2cdf0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2ce00 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2ce10 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
2ce20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
2ce30 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
2ce40 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
2ce50 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
2ce60 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
2ce70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2ce80 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
2ce90 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2cea0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ceb0 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
2cec0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2ced0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
2cee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2cef0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
2cf00 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
2cf10 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
2cf20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2cf30 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2cf40 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2cf60 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2cf70 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2cf90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2cfa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cfb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2cfc0 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
2cfd0 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
2cfe0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
2cff0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
2d000 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2d010 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
2d020 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2d030 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
2d040 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
2d050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d060 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
2d070 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
2d080 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d090 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
2d0a0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
2d0b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2d0c0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
2d0d0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
2d0e0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
2d0f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2d100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d110 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2d120 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2d130 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
2d140 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2d150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
2d160 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2d170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d180 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2d1a0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
2d1b0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2d1c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d1d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2d1e0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
2d1f0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
2d200 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
2d210 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2d220 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2d230 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
2d240 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2d250 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
2d260 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2d290 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
2d2a0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2d2b0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2d2d0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2d2e0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d300 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2d310 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2d330 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2d340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d370 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2d380 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2d390 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2d3a0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2d3b0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
2d3c0 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
2d3d0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
2d3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d400 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2d410 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
2d420 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
2d430 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
2d440 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d450 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
2d460 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
2d470 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
2d480 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
2d490 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
2d4a0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
2d4b0 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
2d4c0 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
2d4d0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
2d4e0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
2d4f0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
2d500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d510 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2d520 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2d530 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2d540 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2d550 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2d560 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
2d570 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
2d580 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
2d590 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d5a0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d5c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
2d5d0 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
2d5e0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2d5f0 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
2d600 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
2d610 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
2d620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2d630 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2d640 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2d650 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
2d660 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
2d670 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
2d680 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
2d690 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
2d6a0 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
2d6b0 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
2d6c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d6d0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
2d6e0 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
2d6f0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
2d700 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
2d710 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
2d720 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2d730 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
2d740 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
2d750 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2d760 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
2d770 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
2d780 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
2d790 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2d7a0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2d7b0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d7c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2d7d0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74  prCompare(0, pIt
2d7e0 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
2d7f0 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2d800 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d830 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
2d840 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
2d850 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
2d860 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
2d870 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
2d880 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
2d890 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d8a0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
2d8b0 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
2d8c0 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
2d8d0 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
2d8e0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2d8f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d900 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
2d910 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2d920 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2d930 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2d940 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
2d950 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
2d960 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
2d970 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2d980 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
2d990 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2d9a0 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
2d9b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2d9c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2d9d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d9e0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
2d9f0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
2da00 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
2da10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
2da20 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
2da30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2da40 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
2da50 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  oken, .         
2da60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2da70 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
2da80 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2da90 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
2daa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2dab0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
2dac0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2dad0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2dae0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
2daf0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2db00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2db20 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2db30 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2db40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2db50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2db60 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
2db70 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
2db80 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
2db90 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
2dba0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2dbb0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2dbc0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2dbd0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2dbe0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2dbf0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2dc00 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2dc10 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2dc20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2dc30 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
2dc40 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2dc50 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2dc60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2dc70 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2dc80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dc90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2dca0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2dcb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2dcc0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2dcd0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2dce0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2dcf0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
2dd00 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2dd10 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2dd20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2dd30 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2dd40 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a  >walkerDepth++;.
2dd50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2dd60 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2dd70 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72  void analyzeAggr
2dd80 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2dd90 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  d(Walker *pWalke
2dda0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
2ddb0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
2ddc0 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2ddd0 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c  ;.  pWalker->wal
2dde0 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f  kerDepth--;.}../
2ddf0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
2de00 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2de10 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
2de20 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2de30 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
2de40 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
2de50 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
2de60 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
2de70 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
2de80 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
2de90 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
2dea0 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
2deb0 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
2dec0 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
2ded0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
2dee0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2def0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
2df00 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
2df10 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
2df20 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
2df30 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
2df40 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
2df50 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2df60 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
2df70 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2df80 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
2df90 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2dfa0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2dfb0 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
2dfc0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2dfd0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2dfe0 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
2dff0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2e000 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  2 = analyzeAggre
2e010 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2e020 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74  ;.  w.walkerDept
2e030 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43  h = 0;.  w.u.pNC
2e040 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
2e050 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
2e060 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
2e070 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2e080 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
2e090 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
2e0a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2e0b0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
2e0c0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
2e0d0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
2e0e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2e0f0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
2e100 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2e110 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
2e120 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
2e130 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
2e140 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e150 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
2e160 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
2e170 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
2e180 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2e190 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
2e1a0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
2e1b0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
2e1c0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
2e1d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
2e1e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2e1f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2e200 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2e210 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
2e220 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
2e230 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2e240 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
2e250 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
2e260 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
2e270 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
2e280 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2e290 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
2e2a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
2e2b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2e2d0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
2e2e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e2f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2e300 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
2e310 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
2e320 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
2e330 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
2e340 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
2e350 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
2e360 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f  * purpose..*/.vo
2e370 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2e380 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2e390 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2e3a0 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2e3b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2e3c0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2e3d0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2e3e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
2e3f0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
2e400 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
2e410 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2e420 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
2e430 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
2e440 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
2e450 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a  e registers..*/.
2e460 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2e470 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2e480 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
2e490 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
2e4a0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65  if( nReg==1 ) re
2e4b0 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54  turn sqlite3GetT
2e4c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2e4d0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
2e4e0 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
2e4f0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2e500 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
2e510 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  ){.    pParse->i
2e520 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
2e530 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
2e540 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
2e550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
2e560 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2e570 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
2e580 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
2e590 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
2e5a0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2e5b0 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
2e5c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2e5d0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
2e5e0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
2e5f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2e600 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2e610 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74  , iReg);.    ret
2e620 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
2e630 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
2e640 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
2e650 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2e660 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2e670 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
2e680 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2e690 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
2e6a0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
2e6b0 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
2e6c0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
2e6d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
2e6e0 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2e6f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2e700 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
2e710 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
2e720 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
2e730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
2e740 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
2e750 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
2e760 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
2e770 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
2e780 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
2e790 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
2e7a0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
2e7b0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
2e7c0 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
2e7d0 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
2e7e0 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
2e7f0 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
2e800 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2e810 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
2e820 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
2e830 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
2e840 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
2e850 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2e860 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
2e870 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73  RangeReg > iFirs
2e880 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2e890 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61  iRangeReg <= iLa
2e8a0 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74  st.  ){.     ret
2e8b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
2e8c0 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
2e8d0 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a  nTempReg; i++){.
2e8e0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
2e8f0 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69  aTempReg[i]>=iFi
2e900 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61  rst && pParse->a
2e910 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73  TempReg[i]<=iLas
2e920 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
2e930 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
2e940 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2e950 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2e960 42 55 47 20 2a 2f 0a                             BUG */.