/ Hex Artifact Content
Login

Artifact a41e5a03d60e2d99a8eac1535f21258e3833b29a3f52789e76284d97b54bed5f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 7c 28 69 56 61 6c 75 65 3f 45 50 5f 49 73 54  f|(iValue?EP_IsT
66b0: 72 75 65 3a 45 50 5f 49 73 46 61 6c 73 65 29 3b  rue:EP_IsFalse);
66c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66d0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6700: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6710: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
6720: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6730: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6740: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6750: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6760: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6770: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6780: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6790: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
67a0: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
67b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
67c0: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67d0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6800: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
6810: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
6820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6830: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6840: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6850: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6860: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6870: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6880: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6890: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68a0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68b0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68c0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68d0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68e0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
68f0: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6900: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6910: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6920: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6930: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6940: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6950: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6960: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6970: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6980: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6990: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69a0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69c0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69d0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
69f0: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a00: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a10: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a30: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a40: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a50: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a60: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a70: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a80: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6a90: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6aa0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ab0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ac0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ad0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6ae0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6af0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b00: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b10: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b20: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b30: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b40: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b50: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b60: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6b90: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bb0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6bd0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6bf0: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c00: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c10: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c20: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c40: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c50: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cb0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cc0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6cd0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6ce0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6cf0: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d00: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d10: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d20: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d40: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d50: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d60: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d70: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d80: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6d90: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6da0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6db0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dc0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6dd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6df0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e60: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6e90: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 70 20 3d    Expr *p;.  p =
6ea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6eb0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6ec0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6ed0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6ee0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
6ef0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6f00: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 30 78 66  p->op = op & 0xf
6f10: 66 3b 0a 20 20 20 20 70 2d 3e 69 41 67 67 20 3d  f;.    p->iAgg =
6f20: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
6f30: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6f40: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
6f50: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f70: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
6f80: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
6f90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
6fa0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
6fc0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
6fd0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6fe0: 65 2d 3e 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  e->db, pRight);.
6ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7000: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7010: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
7020: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
7030: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
7040: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
7050: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
7060: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
7070: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7080: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
70a0: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
70b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
70c0: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
70d0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
70e0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
70f0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7100: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7110: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7120: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
7130: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
7140: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7150: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7160: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
7170: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
71a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
71b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
71c0: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
71d0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  .  }.}.../*.** J
71e0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
71f0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7200: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7210: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7220: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7230: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7240: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7250: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7260: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7270: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7280: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7290: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
72a0: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
72b0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
72c0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
72d0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
72e0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
72f0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7300: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7310: 45 78 70 72 41 6e 64 28 50 61 72 73 65 20 2a 70  ExprAnd(Parse *p
7320: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c 65  Parse, Expr *pLe
7330: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
7340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7350: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7360: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 20 29   if( pLeft==0  )
7370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
7380: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
7390: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
73a0: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
73b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
73c0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 52  se->nErr || IN_R
73d0: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
73e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
73f0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
7400: 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70  TK_AND, pLeft, p
7410: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20  Right);.  }else 
7420: 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46 61  if( ExprAlwaysFa
7430: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 45 78  lse(pLeft) || Ex
7440: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
7450: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
7460: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7470: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
7480: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7490: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
74a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
74b0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
74c0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
74d0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
74e0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
74f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
7500: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7510: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
7520: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
7530: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
7540: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
7550: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
7560: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7570: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7580: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7590: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
75a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
75b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
75c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
75d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
75e0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
75f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7600: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
7610: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7620: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
7630: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
7640: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
7650: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
7660: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7670: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7680: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7690: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
76a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
76b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
76c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76d0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7700: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7710: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7720: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7730: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7750: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
7760: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7770: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7780: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7790: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
77a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
77b0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
77c0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
77d0: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
77e0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
77f0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7800: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
7810: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
7820: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
7830: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7840: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
7850: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
7860: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7870: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7880: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
7890: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
78a0: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
78b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
78c0: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
78d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
78e0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
78f0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7900: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7910: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7920: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7930: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7940: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7950: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7960: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7970: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7980: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7990: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
79a0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
79b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
79c0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
79d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
79e0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
79f0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7a00: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7a10: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7a20: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7a30: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7a40: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7a50: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7a60: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7a70: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a80: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a90: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7aa0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7ab0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7ac0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7ad0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7ae0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7af0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7b00: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7b10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7b20: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7b30: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7b40: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7b50: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7b60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7b70: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b90: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7ba0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7bb0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7bd0: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7be0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7bf0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7c00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7c10: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7c20: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7c30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7c40: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7c50: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7c60: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7c70: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c80: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7c90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7ca0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7cb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7cc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7cd0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7ce0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7cf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7d00: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7d10: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7d20: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7d30: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7d40: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7d50: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7d60: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7d70: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7d80: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7d90: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7da0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7db0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7dc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7dd0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7de0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7df0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7e00: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7e10: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7e20: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7e30: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7e40: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7e50: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7e60: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7e70: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7e80: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7e90: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7ea0: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7eb0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7ed0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7ee0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7ef0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7f00: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f30: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7f40: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7f50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7f60: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7f70: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7f80: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7f90: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7fa0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7fb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7fc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7fd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7fe0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ff0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
8000: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
8010: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
8020: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8030: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8040: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
8050: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
8060: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8070: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
8080: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
8090: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
80a0: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
80b0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
80c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
80d0: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
80e0: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
80f0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8100: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8110: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8130: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
8140: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8150: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8160: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8170: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8180: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8190: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
81a0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
81b0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
81c0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
81d0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
81e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
81f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8200: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8210: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8220: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8230: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8240: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8260: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8270: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8280: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8290: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
82a0: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
82b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
82c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
82d0: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
82e0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
82f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8300: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8310: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8320: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8330: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8340: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8350: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8360: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8370: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8390: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
83a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
83b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
83c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
83d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
83e0: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
83f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8400: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8410: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8420: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8430: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
8440: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8450: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8460: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8470: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8480: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8490: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
84a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
84b0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
84c0: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
84d0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
84e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
84f0: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8500: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
8510: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8520: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
8530: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
8540: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
8550: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
8560: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
8570: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
8580: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
8590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
85a0: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
85b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
85c0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
85d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
85e0: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
85f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8600: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
8610: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
8620: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
8630: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
8640: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
8650: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8660: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
8670: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8680: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8690: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
86a0: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
86b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
86c0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
86d0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
86e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
86f0: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
8700: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
8710: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8720: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
8730: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
8740: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
8750: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8760: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
8770: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
8780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8790: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
87a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
87b0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
87c0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
87d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
87f0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
8800: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
8810: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8820: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8830: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nc) ){.      ass
8840: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
8850: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
8860: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
8870: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79 2e 70 57  lete(db, p->y.pW
8880: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  in);.    }.  }. 
8890: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
88a0: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
88b0: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
88c0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
88d0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
88e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88f0: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
8900: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8910: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
8920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8930: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
8940: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8950: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8960: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8970: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8980: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8990: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
89a0: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
89b0: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
89c0: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
89d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
89e0: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
89f0: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8a00: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8a10: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8a20: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a40: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
8a50: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8a60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8a70: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8a80: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8a90: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8aa0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8ab0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8ac0: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8ad0: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8ae0: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8af0: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  IZE;.}../*.** Co
8b00: 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
8b10: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 45 78  content of an Ex
8b20: 70 72 20 6e 6f 64 65 2c 20 74 61 6b 69 6e 67 20  pr node, taking 
8b30: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
8b40: 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64  .** past the end
8b50: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
8b60: 65 20 66 6f 72 20 61 20 72 65 64 75 63 65 64 2d  e for a reduced-
8b70: 73 69 7a 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  size version of 
8b80: 74 68 65 20 73 6f 75 72 63 65 0a 2a 2a 20 45 78  the source.** Ex
8b90: 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pr..*/.static vo
8ba0: 69 64 20 65 78 70 72 4e 6f 64 65 43 6f 70 79 28  id exprNodeCopy(
8bb0: 45 78 70 72 20 2a 70 44 65 73 74 2c 20 45 78 70  Expr *pDest, Exp
8bc0: 72 20 2a 70 53 72 63 29 7b 0a 20 20 6d 65 6d 73  r *pSrc){.  mems
8bd0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 73 69 7a  et(pDest, 0, siz
8be0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
8bf0: 6d 63 70 79 28 70 44 65 73 74 2c 20 70 53 72 63  mcpy(pDest, pSrc
8c00: 2c 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  , exprStructSize
8c10: 28 70 53 72 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pSrc));.}../*.*
8c20: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a  * The dupedExpr*
8c30: 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20  Size() routines 
8c40: 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20  each return the 
8c50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8c60: 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73  required.** to s
8c70: 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61  tore a copy of a
8c80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20  n expression or 
8c90: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8ca0: 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e    They differ in
8cb0: 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  .** how much of 
8cc0: 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73  the tree is meas
8cd0: 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ured..**.**     
8ce0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8cf0: 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f  ize()     Size o
8d00: 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20  f only the Expr 
8d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20  structure .**   
8d20: 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53    dupedExprNodeS
8d30: 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65  ize()       Size
8d40: 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65   of Expr + space
8d50: 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20   for token.**   
8d60: 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28    dupedExprSize(
8d70: 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72  )           Expr
8d80: 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72   + token + subtr
8d90: 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a  ee components.**
8da0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8df0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8e00: 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e  StructSize() fun
8e10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77  ction returns tw
8e20: 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74  o values OR-ed t
8e30: 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31  ogether:  .** (1
8e40: 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  ) the space requ
8e50: 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20  ired for a copy 
8e60: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
8e70: 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a  cture only and .
8e80: 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78  ** (2) the EP_xx
8e90: 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64  x flags that ind
8ea0: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73  icate what the s
8eb0: 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68  tructure size sh
8ec0: 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20  ould be..** The 
8ed0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73  return values is
8ee0: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a   always one of:.
8ef0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  **.**      EXPR_
8f00: 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20  FULLSIZE.**     
8f10: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8f20: 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64  E   | EP_Reduced
8f30: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f  .**      EXPR_TO
8f40: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
8f50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a  _TokenOnly.**.**
8f60: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8f70: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
8f80: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
8f90: 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
8fa0: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72  lue.** of this r
8fb0: 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66  outine with 0xff
8fc0: 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61  f.  The flags ca
8fd0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
8fe0: 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74  sking the.** ret
8ff0: 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45  urn value with E
9000: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
9010: 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  enOnly..**.** No
9020: 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61  te that with fla
9030: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9040: 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  CE, this routine
9050: 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d  s works on full-
9060: 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63  size.** (unreduc
9070: 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73  ed) Expr objects
9080: 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67   as they or orig
9090: 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74  inally construct
90a0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
90b0: 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72  ..** During expr
90c0: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c  ession analysis,
90d0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
90e0: 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  on is computed a
90f0: 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a  nd moved into.**
9100: 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20   later parts of 
9110: 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74 20  the Expr object 
9120: 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69  and that extra i
9130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74  nformation might
9140: 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20   get chopped.** 
9150: 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65  off if the expre
9160: 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64  ssion is reduced
9170: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
9180: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f  t it does not wo
9190: 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e  rk to.** make an
91a0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
91b0: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
91c0: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
91d0: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
91e0: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
91f0: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
9200: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
9210: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
9220: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
9230: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
9240: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
9250: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
9260: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
9270: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
9280: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
9290: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
92a0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
92b0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
92c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
92d0: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
92e0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
92f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
9300: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
9310: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
9320: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
9330: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
9340: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
9350: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
9360: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
9370: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
9380: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c  0 );.  if( 0==fl
9390: 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ags || p->op==TK
93a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a  _SELECT_COLUMN .
93b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
93c0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
93d0: 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70    || ExprHasProp
93e0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
93f0: 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  nc).#endif.  ){.
9400: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9410: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
9420: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9430: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9440: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
9450: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
9460: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9470: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9480: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
9490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94b0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
94c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94e0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
94f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
9500: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
9510: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
9520: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9530: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
9540: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9550: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9560: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9570: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9580: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9590: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
95a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
95b0: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
95c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
95d0: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
95e0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
95f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
9600: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
9610: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
9620: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9630: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
9640: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
9650: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
9660: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9670: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9680: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9690: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
96a0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
96b0: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
96c0: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
96d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
96e0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
96f0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
9700: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
9710: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9720: 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  0NN(p->u.zToken)
9730: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
9740: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
9750: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9760: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9770: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9780: 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61  create a duplica
9790: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78  te of the .** ex
97a0: 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
97b0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
97c0: 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e  ument. The secon
97d0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  d argument is a.
97e0: 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69  ** mask containi
97f0: 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  ng EXPRDUP_XXX f
9800: 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
9810: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
9820: 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f  ncludes space to
9830: 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
9840: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9850: 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20  t.** itself and 
9860: 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72  the buffer refer
9870: 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75  red to by Expr.u
9880: 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e  .zToken, if any.
9890: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
98a0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
98b0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
98c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
98d0: 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61  includes .** spa
98e0: 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  ce to duplicate 
98f0: 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69  all Expr nodes i
9900: 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65  n the tree forme
9910: 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20  d by Expr.pLeft 
9920: 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69  .** and Expr.pRi
9930: 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62  ght variables (b
9940: 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73  ut not for any s
9950: 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65  tructures pointe
9960: 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63  d to or .** desc
9970: 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45  ended from the E
9980: 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45  xpr.x.pList or E
9990: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61  xpr.x.pSelect va
99a0: 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61  riables)..*/.sta
99b0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
99c0: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  rSize(Expr *p, i
99d0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
99e0: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66   nByte = 0;.  if
99f0: 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ( p ){.    nByte
9a00: 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65   = dupedExprNode
9a10: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
9a20: 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58      if( flags&EX
9a30: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a  PRDUP_REDUCE ){.
9a40: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64        nByte += d
9a50: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
9a60: 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20  pLeft, flags) + 
9a70: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9a80: 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b  >pRight, flags);
9a90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9aa0: 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a  urn nByte;.}../*
9ab0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9ac0: 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
9ad0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29  sqlite3ExprDup()
9ae0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66  , except that if
9af0: 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73   pzBuffer .** is
9b00: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a   not NULL then *
9b10: 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75  pzBuffer is assu
9b20: 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  med to point to 
9b30: 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
9b40: 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f  nough .** to sto
9b50: 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65  re the copy of e
9b60: 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65  xpression p, the
9b70: 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e   copies of p->u.
9b80: 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70  zToken.** (if ap
9b90: 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74  plicable), and t
9ba0: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  he copies of the
9bb0: 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d   p->pLeft and p-
9bc0: 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69  >pRight expressi
9bd0: 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20  ons,.** if any. 
9be0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
9bf0: 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73  , *pzBuffer is s
9c00: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
9c10: 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a  byte past the.**
9c20: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
9c30: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
9c40: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
9c50: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
9c60: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
9c70: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
9c80: 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c  p, int dupFlags,
9c90: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
9ca0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
9cc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
9cd0: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20   u8 *zAlloc;    
9ce0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9cf0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63   space from whic
9d00: 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20  h to build Expr 
9d10: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
9d20: 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20  staticFlag;     
9d30: 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69    /* EP_Static i
9d40: 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61  f space not obta
9d50: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
9d60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64   */..  assert( d
9d70: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
9d80: 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
9d90: 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20   dupFlags==0 || 
9da0: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9db0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73  P_REDUCE );.  as
9dc0: 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d  sert( pzBuffer==
9dd0: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
9de0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
9df0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
9e00: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
9e10: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
9e20: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66  ructure. */.  if
9e30: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
9e40: 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75    zAlloc = *pzBu
9e50: 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63  ffer;.    static
9e60: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
9e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9e80: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
9e90: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
9ea0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9eb0: 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20  , dupFlags));.  
9ec0: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30    staticFlag = 0
9ed0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28  ;.  }.  pNew = (
9ee0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
9ef0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9f00: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
9f10: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
9f20: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
9f30: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
9f40: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70  d to.    ** by p
9f50: 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74  New. This is eit
9f60: 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  her EXPR_FULLSIZ
9f70: 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  E, EXPR_REDUCEDS
9f80: 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58  IZE or.    ** EX
9f90: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9fa0: 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20  . nToken is set 
9fb0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9fc0: 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a   bytes consumed.
9fd0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
9fe0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
9ff0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
a000: 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
a010: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
a020: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
a030: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
a040: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b  ze(p, dupFlags);
a050: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
a060: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
a070: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
a080: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20     int nToken;. 
a090: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a0a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
a0b0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
a0c0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
a0d0: 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  nToken = sqlite3
a0e0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
a0f0: 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d  oken) + 1;.    }
a100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  else{.      nTok
a110: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
a120: 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29    if( dupFlags )
a130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a140: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a150: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
a160: 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 );.      memcp
a170: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
a180: 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  wSize);.    }els
a190: 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69  e{.      u32 nSi
a1a0: 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74  ze = (u32)exprSt
a1b0: 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20  ructSize(p);.   
a1c0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a1d0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
a1e0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50     if( nSize<EXP
a1f0: 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20  R_FULLSIZE ){ . 
a200: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
a210: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
a220: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
a230: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
a240: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
a250: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
a260: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
a270: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
a280: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
a290: 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66  . */.    pNew->f
a2a0: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
a2b0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a2c0: 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d  y|EP_Static|EP_M
a2d0: 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e  emToken);.    pN
a2e0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
a2f0: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
a300: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a310: 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nly);.    pNew->
a320: 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46  flags |= staticF
a330: 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  lag;..    /* Cop
a340: 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  y the p->u.zToke
a350: 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79  n string, if any
a360: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f  . */.    if( nTo
a370: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ken ){.      cha
a380: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
a390: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
a3a0: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
a3b0: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  Size];.      mem
a3c0: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
a3d0: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
a3e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
a3f0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
a400: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45  New->flags) & (E
a410: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a420: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f  eaf)) ){.      /
a430: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
a440: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
a450: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
a460: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
a470: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a480: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
a490: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
a4a0: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a4b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a4c0: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
a4d0: 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ect, dupFlags);.
a4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a4f0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
a500: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a510: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
a520: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
a530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a540: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
a550: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
a560: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
a570: 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
a580: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a590: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a5a0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46 75  kenOnly|EP_WinFu
a5b0: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  nc) ){.      zAl
a5c0: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a5d0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a5e0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a5f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a600: 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e  y(pNew, EP_Token
a610: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a620: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a630: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20  Left = p->pLeft 
a640: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a650: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a660: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
a670: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a680: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a690: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a6a0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20   = p->pRight ?. 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a6d0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
a6e0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a6f0: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a700: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a710: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
a720: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
a730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a740: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
a750: 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57        pNew->y.pW
a760: 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  in = sqlite3Wind
a770: 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20  owDup(db, pNew, 
a780: 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20  p->y.pWin);.    
a790: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a7a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a7b0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
a7c0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a7d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a7e0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a7f0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
a800: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75  ){.        *pzBu
a810: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
a820: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a830: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  {.      if( !Exp
a840: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a850: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a860: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
a870: 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54   if( pNew->op==T
a880: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
a890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
a8a0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a8b0: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  eft;.          a
a8c0: 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d  ssert( p->iColum
a8d0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
a8e0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
a8f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
a900: 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52  ght==0  || p->pR
a910: 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29  ight==p->pLeft )
a920: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a930: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a940: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
a950: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
a960: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
a970: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77    }.        pNew
a980: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
a990: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
a9a0: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
a9b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a9c0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
a9d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
a9e0: 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20  d return a deep 
a9f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65  copy of the obje
aa00: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aa10: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
aa20: 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ment. If an OOM 
aa30: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63  condition is enc
aa40: 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69  ountered, NULL i
aa50: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
aa60: 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  d the db->malloc
aa70: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e  Failed flag set.
aa80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
aa90: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74  TE_OMIT_CTE.stat
aaa0: 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70  ic With *withDup
aab0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
aac0: 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a  th *p){.  With *
aad0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
aae0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
aaf0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
ab00: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
ab10: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
ab20: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
ab30: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
ab40: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ab50: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
ab60: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
ab70: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
ab80: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
ab90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
aba0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
abb0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
abc0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
abd0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
abe0: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
abf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
ac00: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
ac10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ac20: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
ac30: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
ac40: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
ac50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ac60: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
ac70: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
ac80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ac90: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
aca0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
acb0: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
acc0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
acd0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
ace0: 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74 68  C./*.** The gath
acf0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
ad00: 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64 20  ) procedure and 
ad10: 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  its helper routi
ad20: 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c 65  ne.** gatherSele
ad30: 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63  ctWindowsCallbac
ad40: 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f 20  k() are used to 
ad50: 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  scan all the exp
ad60: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20 61  ressions.** an a
ad70: 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74 65   newly duplicate
ad80: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
ad90: 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61 6c  nt and gather al
ada0: 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 0a  l of the Window.
adb0: 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e 64  ** objects found
adc0: 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c 69   there, assembli
add0: 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68 65  ng them onto the
ade0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74 20   linked list at 
adf0: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a 2f  Select->pWin..*/
ae00: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
ae10: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
ae20: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
ae30: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
ae40: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
ae50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
ae60: 49 4f 4e 20 26 26 20 70 45 78 70 72 2d 3e 79 2e  ION && pExpr->y.
ae70: 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 61  pWin!=0 ){.    a
ae80: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
ae90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
aea0: 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20  _WinFunc) );.   
aeb0: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e   pExpr->y.pWin->
aec0: 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61 6c 6b  pNextWin = pWalk
aed0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70  er->u.pSelect->p
aee0: 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b 65 72  Win;.    pWalker
aef0: 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69  ->u.pSelect->pWi
af00: 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  n = pExpr->y.pWi
af10: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
af20: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
af30: 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68 65  static int gathe
af40: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
af50: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57 61 6c  lectCallback(Wal
af60: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
af70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 74 75  lect *p){.  retu
af80: 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  rn p==pWalker->u
af90: 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43 5f 43  .pSelect ? WRC_C
afa0: 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f 50 72  ontinue : WRC_Pr
afb0: 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  une;.}.static vo
afc0: 69 64 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  id gatherSelectW
afd0: 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20 2a 70  indows(Select *p
afe0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
aff0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
b000: 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74 57   = gatherSelectW
b010: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 3b 0a  indowsCallback;.
b020: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b030: 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65  ack = gatherSele
b040: 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43  ctWindowsSelectC
b050: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b060: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
b070: 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  0;.  w.pParse = 
b080: 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65 63 74  0;.  w.u.pSelect
b090: 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57   = p;.  sqlite3W
b0a0: 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 29  alkSelect(&w, p)
b0b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
b0c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b0d0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
b0e0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
b0f0: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
b100: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
b110: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
b120: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
b130: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
b140: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
b150: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
b160: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
b170: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
b180: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
b190: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
b1a0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
b1b0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
b1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
b1d0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
b1e0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
b1f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b200: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
b210: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
b220: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
b230: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
b240: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
b250: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
b260: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
b270: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
b280: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
b290: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
b2a0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
b2b0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
b2c0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
b2d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
b2e0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
b2f0: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
b300: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
b310: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
b320: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
b330: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
b340: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
b350: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
b360: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
b370: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
b380: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
b390: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
b3a0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
b3b0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
b3c0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b3d0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b3e0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
b3f0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
b400: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b410: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
b420: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
b430: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
b440: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
b450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
b460: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
b470: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
b480: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
b490: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
b4a0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
b4b0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b4c0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b4d0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
b4e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b4f0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b500: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b510: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b520: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b530: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b540: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b550: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b560: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b570: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b580: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b590: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b5a0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b5b0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b5c0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b5d0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b5e0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b5f0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b600: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b610: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b620: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b630: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b640: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b650: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b660: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b670: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b680: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b690: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b6a0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b6b0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b6c0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b6d0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b6e0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b6f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b700: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b710: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b720: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b730: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b740: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b750: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b760: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b770: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b780: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b790: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b7a0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b7b0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b7c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b7d0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b7e0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b7f0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b810: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b820: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b830: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b850: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b860: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b870: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b880: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b890: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b8a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b8b0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b8c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b8d0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b8e0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b8f0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b900: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b910: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b920: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b930: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b940: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b950: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b960: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b970: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b980: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b990: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62  ab;.    pItem->b
b9a0: 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64  SorterRef = pOld
b9b0: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b9c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b9d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b9e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
ba00: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
ba10: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
ba20: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
ba30: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
ba40: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
ba50: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
ba60: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
ba70: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
ba80: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
ba90: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
baa0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
bab0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
bac0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
bad0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
bae0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
baf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
bb00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bb10: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
bb20: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
bb30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
bb40: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
bb50: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
bb60: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
bb70: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
bb80: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
bb90: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
bba0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
bbb0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
bbc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
bbd0: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
bbe0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
bbf0: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
bc00: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
bc10: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
bc20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bc30: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bc40: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
bc50: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
bc60: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
bc70: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
bc80: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
bc90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
bca0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
bcb0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
bcc0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
bcd0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
bce0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
bcf0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
bd00: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
bd10: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
bd20: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
bd30: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
bd40: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
bd50: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
bd60: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bd70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
bd80: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
bd90: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bda0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bdb0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bdc0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
bdd0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
bde0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bdf0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
be00: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
be10: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
be20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
be30: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
be40: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
be50: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
be60: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
be70: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
be80: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
be90: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
bea0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
beb0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
bec0: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
bed0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
bee0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
bef0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
bf00: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bf10: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
bf20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
bf30: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
bf40: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
bf50: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
bf60: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
bf70: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
bf80: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
bf90: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
bfa0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bfb0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bfc0: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
bfd0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
bfe0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
bff0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
c000: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
c010: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
c020: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
c030: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
c040: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
c050: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
c060: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
c070: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
c080: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
c090: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c0a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
c0b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c0c0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
c0d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
c0e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c0f0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
c100: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
c110: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
c120: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
c130: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
c140: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
c150: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
c160: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
c170: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
c180: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
c190: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
c1a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c1b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
c1c0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c1d0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
c1e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
c1f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
c200: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
c210: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
c220: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c230: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
c240: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
c250: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
c260: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
c270: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77  bFreeNN(db, pNew
c280: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c290: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
c2a0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
c2b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
c2c0: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
c2d0: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
c2e0: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
c2f0: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
c300: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
c310: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
c320: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
c330: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
c340: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
c350: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
c360: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
c370: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c380: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
c390: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
c3a0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c3b0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
c3c0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
c3d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
c3e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c3f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c400: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
c410: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
c420: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
c430: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c440: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
c450: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
c460: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
c470: 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Dup, int flags){
c480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20  .  Select *pRet 
c490: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
c4a0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Next = 0;.  Sele
c4b0: 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ct **pp = &pRet;
c4c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20  .  Select *p;.. 
c4d0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c4e0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20  ;.  for(p=pDup; 
c4f0: 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b  p; p=p->pPrior){
c500: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
c510: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c520: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c530: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69  eof(*p) );.    i
c540: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65  f( pNew==0 ) bre
c550: 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  ak;.    pNew->pE
c560: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c570: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c580: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
c590: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  .    pNew->pSrc 
c5a0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
c5b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
c5c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c5d0: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
c5e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c5f0: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
c600: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
c610: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
c620: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c630: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
c640: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61  );.    pNew->pHa
c650: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
c660: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
c670: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
c680: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
c690: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c6a0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
c6b0: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
c6c0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d     pNew->op = p-
c6d0: 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  >op;.    pNew->p
c6e0: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
c6f0: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
c700: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c   0;.    pNew->pL
c710: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
c720: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
c730: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  mit, flags);.   
c740: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
c750: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
c760: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
c770: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
c780: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
c790: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
c7a0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c7b0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
c7c0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c7d0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
c7e0: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
c7f0: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
c800: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
c810: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
c820: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23  db, p->pWith);.#
c830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c840: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
c850: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30    pNew->pWin = 0
c860: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  ;.    pNew->pWin
c870: 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69  Defn = sqlite3Wi
c880: 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20  ndowListDup(db, 
c890: 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20  p->pWinDefn);.  
c8a0: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 20    if( p->pWin ) 
c8b0: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
c8c0: 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64 69  ows(pNew);.#endi
c8d0: 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49  f.    pNew->selI
c8e0: 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20  d = p->selId;.  
c8f0: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c900: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c910: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c920: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c930: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c940: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c950: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c960: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c970: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c980: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c990: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c9a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c9b0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c9c0: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c9d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c9e0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c9f0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
ca00: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
ca10: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
ca20: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
ca30: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
ca40: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
ca50: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
ca60: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
ca70: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
ca80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
ca90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
caa0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
cab0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
cac0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
cad0: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
cae0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
caf0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cb00: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
cb10: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
cb20: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
cb30: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
cb40: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
cb50: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
cb60: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
cb70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cb80: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
cb90: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
cba0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
cbb0: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
cbc0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
cbd0: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
cbe0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
cbf0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
cc00: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
cc10: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
cc20: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
cc30: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
cc40: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
cc50: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
cc60: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
cc70: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
cc80: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
cc90: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
cca0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
ccb0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
ccc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ccd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
cce0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ccf0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd00: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
cd10: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
cd20: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
cd30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
cd40: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
cd50: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
cd60: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
cd70: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
cd80: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
cd90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
cda0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cdb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cdc0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
cdd0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
cde0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
cdf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
ce00: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
ce10: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
ce20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
ce30: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
ce40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
ce50: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
ce60: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
ce70: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
ce80: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
ce90: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
cea0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
ceb0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
cec0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
ced0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
cee0: 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c 69 74  pList)+(2*(sqlit
cef0: 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74 2d 3e  e3_int64)pList->
cf00: 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f 66 28  nExpr-1)*sizeof(
cf10: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
cf20: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
cf30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
cf40: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
cf50: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
cf60: 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
cf70: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
cf80: 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r++];.  assert( 
cf90: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cfa0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
cfb0: 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74  ame)==sizeof(pIt
cfc0: 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20  em->pExpr) );.  
cfd0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66  assert( offsetof
cfe0: 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74  (struct ExprList
cff0: 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20  _item,pExpr)==0 
d000: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74  );.  memset(&pIt
d010: 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65  em->zName,0,size
d020: 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65  of(*pItem)-offse
d030: 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c  tof(struct ExprL
d040: 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29  ist_item,zName))
d050: 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  ;.  pItem->pExpr
d060: 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75   = pExpr;.  retu
d070: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
d080: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
d090: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
d0a0: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
d0b0: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
d0c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d0d0: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
d0e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d0f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
d100: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d110: 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64  .** pColumns and
d120: 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65   pExpr form a ve
d130: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20  ctor assignment 
d140: 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66  which is part of
d150: 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75   the SET.** clau
d160: 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  se of an UPDATE 
d170: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65  statement.  Like
d180: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
d190: 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65      (a,b,c) = (e
d1a0: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
d1b0: 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62  ).** Or:    (a,b
d1c0: 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c  ,c) = (SELECT x,
d1d0: 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a  y,z FROM ....).*
d1e0: 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65  *.** For each te
d1f0: 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  rm of the vector
d200: 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70   assignment, app
d210: 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20  end new entries 
d220: 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  to the.** expres
d230: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
d240: 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66    In the case of
d250: 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74   a subquery on t
d260: 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a  he RHS, append.*
d270: 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  * TK_SELECT_COLU
d280: 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  MN expressions..
d290: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
d2a0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d2b0: 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73  ndVector(.  Pars
d2c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d2d0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d2e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d2f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d300: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d310: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
d320: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d330: 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e   IdList *pColumn
d340: 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  s,      /* List 
d350: 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20  of names of LHS 
d360: 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e  of the assignmen
d370: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
d380: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
d390: 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   Vector expressi
d3a0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
d3b0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
d3c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d3d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d3e0: 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  b;.  int n;.  in
d3f0: 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  t i;.  int iFirs
d400: 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  t = pList ? pLis
d410: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
d420: 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20  /* pColumns can 
d430: 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65  only be NULL due
d440: 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61   to an OOM but a
d450: 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  n OOM will cause
d460: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72   an.  ** exit pr
d470: 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
d480: 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65  ine being invoke
d490: 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  d */.  if( NEVER
d4a0: 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20  (pColumns==0) ) 
d4b0: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
d4c0: 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  nd_error;.  if( 
d4d0: 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20  pExpr==0 ) goto 
d4e0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d4f0: 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ror;..  /* If th
d500: 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f  e RHS is a vecto
d510: 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69  r, then we can i
d520: 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b  mmediately check
d530: 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20   to see that .  
d540: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
d550: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d  he RHS and LHS m
d560: 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68  atch.  But if th
d570: 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43  e RHS is a SELEC
d580: 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72  T, .  ** wildcar
d590: 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20  ds ("*") in the 
d5a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
d5b0: 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  e SELECT must be
d5c0: 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
d5d0: 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20  .  ** we can do 
d5e0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20  the size check, 
d5f0: 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a  so defer the siz
d600: 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f  e check until co
d610: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20  de generation.. 
d620: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
d630: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op!=TK_SELECT &
d640: 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21  & pColumns->nId!
d650: 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56  =(n=sqlite3ExprV
d660: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
d670: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
d680: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d690: 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
d6a0: 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
d6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d6c0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
d6d0: 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74  nId, n);.    got
d6e0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
d6f0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f  error;.  }..  fo
d700: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e  r(i=0; i<pColumn
d710: 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  s->nId; i++){.  
d720: 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72    Expr *pSubExpr
d730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f   = sqlite3ExprFo
d740: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61  rVectorField(pPa
d750: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a  rse, pExpr, i);.
d760: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
d770: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d780: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
d790: 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20   pSubExpr);.    
d7a0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d7b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d7c0: 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b  ->nExpr==iFirst+
d7d0: 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69  i+1 );.      pLi
d7e0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d7f0: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43  pr-1].zName = pC
d800: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
d810: 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  me;.      pColum
d820: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ns->a[i].zName =
d830: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
d840: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
d850: 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d  Failed && pExpr-
d860: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
d870: 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d  & ALWAYS(pList!=
d880: 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  0) ){.    Expr *
d890: 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e  pFirst = pList->
d8a0: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b  a[iFirst].pExpr;
d8b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d8c0: 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  rst!=0 );.    as
d8d0: 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70  sert( pFirst->op
d8e0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
d8f0: 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  MN );.     .    
d900: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c  /* Store the SEL
d910: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
d920: 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69   pRight so it wi
d930: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d940: 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  en.    ** sqlite
d950: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
d960: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
d970: 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68     pFirst->pRigh
d980: 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  t = pExpr;.    p
d990: 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Expr = 0;..    /
d9a0: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73  * Remember the s
d9b0: 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  ize of the LHS i
d9c0: 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74  n iTable so that
d9d0: 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68   we can check th
d9e0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48  at.    ** the RH
d9f0: 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20  S and LHS sizes 
da00: 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64  match during cod
da10: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f  e generation. */
da20: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61  .    pFirst->iTa
da30: 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ble = pColumns->
da40: 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72  nId;.  }..vector
da50: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
da60: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
da70: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
da80: 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e  ite3RenameExprUn
da90: 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  map(pParse, pExp
daa0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
dab0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
dac0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
dad0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
dae0: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
daf0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
db00: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
db10: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
db20: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
db30: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
db40: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
db50: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
db60: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
db70: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
db80: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
db90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
dba0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
dbb0: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
dbc0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
dbd0: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
dbe0: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
dbf0: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
dc00: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
dc10: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
dc20: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
dc30: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
dc40: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
dc50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
dc60: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
dc70: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
dc80: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
dc90: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
dca0: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
dcb0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
dcc0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
dcd0: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
dce0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
dcf0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
dd00: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
dd10: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
dd20: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
dd30: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
dd40: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
dd50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
dd60: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
dd70: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dd80: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
dd90: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
dda0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
ddb0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
ddc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ddd0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
dde0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ddf0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
de00: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
de10: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
de20: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
de30: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
de40: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
de50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
de60: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
de70: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
de80: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
de90: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
dea0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
deb0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
dec0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
ded0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
dee0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
def0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
df00: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
df10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
df20: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
df30: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
df40: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
df50: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
df60: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
df70: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
df80: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
df90: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
dfa0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
dfb0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
dfc0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
dfd0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
dfe0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
dff0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  BJECT ){.      s
e000: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
e010: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
e020: 69 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  id*)pItem->zName
e030: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , pName);.    }.
e040: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
e050: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
e060: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
e070: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
e080: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
e090: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
e0a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
e0b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
e0c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
e0d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
e0e0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
e0f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
e100: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
e110: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
e120: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
e130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
e140: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
e150: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e160: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
e170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e180: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e190: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
e1a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
e1b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
e1c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
e1d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f  he span. */.  co
e1e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
e1f0: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ,     /* Start o
e200: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20  f the span */.  
e210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
e220: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
e230: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b  f the span */.){
e240: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e250: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
e260: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e270: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
e280: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
e290: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
e2a0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e2b0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
e2c0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
e2d0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
e2e0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
e2f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
e300: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
e310: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
e320: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
e330: 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c  te3DbSpanDup(db,
e340: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
e350: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
e360: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e370: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
e380: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
e390: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
e3a0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
e3b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
e3c0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
e3d0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
e3e0: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
e3f0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
e400: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
e410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
e420: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
e430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
e440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e450: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
e460: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e470: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e480: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
e490: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e4a0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
e4b0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
e4c0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
e4d0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
e4e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e4f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
e500: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
e510: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
e520: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
e530: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
e540: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
e550: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
e560: 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65  oid exprListDele
e570: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
e580: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e590: 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c  t){.  int i = pL
e5a0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74  ist->nExpr;.  st
e5b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e5c0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69  em *pItem =  pLi
e5d0: 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28  st->a;.  assert(
e5e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e5f0: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  );.  do{.    sql
e600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
e610: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
e620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e630: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e640: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
e650: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e660: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
e670: 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c  pItem++;.  }whil
e680: 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71  e( --i>0 );.  sq
e690: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
e6a0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
e6b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e6c0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
e6d0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
e6e0: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
e6f0: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
e700: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
e710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e720: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
e730: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
e740: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
e750: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
e760: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
e770: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
e780: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
e790: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e7a0: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61    u32 m = 0;.  a
e7b0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e7c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
e7d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e7e0: 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70  +){.     Expr *p
e7f0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
e800: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61  i].pExpr;.     a
e810: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e820: 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  );.     m |= pEx
e830: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  pr->flags;.  }. 
e840: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
e850: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45  .** This is a SE
e860: 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61  LECT-node callba
e870: 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ck for the expre
e880: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61  ssion walker tha
e890: 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69  t.** always "fai
e8a0: 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20  ls".  By "fail" 
e8b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65  in this case, we
e8c0: 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61   mean set.** pWa
e8d0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a  lker->eCode to z
e8e0: 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  ero and abort..*
e8f0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
e900: 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75  ck is used by mu
e910: 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f  ltiple expressio
e920: 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e  n walkers..*/.in
e930: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
e940: 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a  alkFail(Walker *
e950: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
e960: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
e970: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
e980: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
e990: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e9a0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
e9c0: 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
e9d0: 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68  on is an ID with
e9e0: 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22   the name "true"
e9f0: 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74   or "false".** t
ea00: 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69  hen convert it i
ea10: 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41  nto an TK_TRUEFA
ea20: 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72  LSE term.  Retur
ea30: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
ea40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
ea50: 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65  happened, and ze
ea60: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
ea70: 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65  sion is unaltere
ea80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ea90: 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c  3ExprIdToTrueFal
eaa0: 73 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  se(Expr *pExpr){
eab0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
eac0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
ead0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Expr->op==TK_STR
eae0: 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78  ING );.  if( !Ex
eaf0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
eb00: 78 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a  xpr, EP_Quoted).
eb10: 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74     && (sqlite3St
eb20: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
eb30: 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d  Token, "true")==
eb40: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
eb50: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
eb60: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c  ->u.zToken, "fal
eb70: 73 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  se")==0).  ){.  
eb80: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
eb90: 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20  _TRUEFALSE;.    
eba0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
ebb0: 70 45 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e  pExpr, pExpr->u.
ebc0: 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45  zToken[4]==0 ? E
ebd0: 50 5f 49 73 54 72 75 65 20 3a 20 45 50 5f 49 73  P_IsTrue : EP_Is
ebe0: 46 61 6c 73 65 29 3b 0a 20 20 20 20 72 65 74 75  False);.    retu
ebf0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
ec00: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
ec10: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
ec20: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
ec30: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
ec40: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
ec50: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
ec60: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
ec70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ec80: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
ec90: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
eca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ecb0: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
ecc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
ecd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
ece0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
ecf0: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
ed00: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
ed10: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
ed20: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
ed30: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
ed40: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
ed50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
ed60: 70 72 20 69 73 20 61 6e 20 41 4e 44 20 6f 72 20  pr is an AND or 
ed70: 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  OR expression, t
ed80: 72 79 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 69  ry to simplify i
ed90: 74 20 62 79 20 65 6c 69 6d 69 6e 61 74 69 6e 67  t by eliminating
eda0: 0a 2a 2a 20 74 65 72 6d 73 20 74 68 61 74 20 61  .** terms that a
edb0: 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 6f  re always true o
edc0: 72 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  r false.  Return
edd0: 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20   the simplified 
ede0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f  expression..** O
edf0: 72 20 72 65 74 75 72 6e 20 74 68 65 20 6f 72 69  r return the ori
ee00: 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ginal expression
ee10: 20 69 66 20 6e 6f 20 73 69 6d 70 6c 69 66 69 63   if no simplific
ee20: 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
ee30: 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
ee40: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 78 3c  s:.**.**     (x<
ee50: 31 30 29 20 41 4e 44 20 74 72 75 65 20 20 20 20  10) AND true    
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
ee70: 20 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28   (x<10).**     (
ee80: 78 3c 31 30 29 20 41 4e 44 20 66 61 6c 73 65 20  x<10) AND false 
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e                =>
eea0: 20 20 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20     false.**     
eeb0: 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32  (x<10) AND (y=22
eec0: 20 4f 52 20 66 61 6c 73 65 29 20 20 20 20 20 3d   OR false)     =
eed0: 3e 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28  >   (x<10) AND (
eee0: 79 3d 32 32 29 0a 2a 2a 20 20 20 20 20 28 78 3c  y=22).**     (x<
eef0: 31 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52  10) AND (y=22 OR
ef00: 20 74 72 75 65 29 20 20 20 20 20 20 3d 3e 20 20   true)      =>  
ef10: 20 28 78 3c 31 30 29 0a 2a 2a 20 20 20 20 20 28   (x<10).**     (
ef20: 79 3d 32 32 29 20 4f 52 20 74 72 75 65 20 20 20  y=22) OR true   
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e                =>
ef40: 20 20 20 74 72 75 65 0a 2a 2f 0a 45 78 70 72 20     true.*/.Expr 
ef50: 2a 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70  *sqlite3ExprSimp
ef60: 6c 69 66 69 65 64 41 6e 64 4f 72 28 45 78 70 72  lifiedAndOr(Expr
ef70: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
ef80: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
ef90: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
efa0: 3d 54 4b 5f 41 4e 44 20 7c 7c 20 70 45 78 70 72  =TK_AND || pExpr
efb0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20  ->op==TK_OR ){. 
efc0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
efd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d  = sqlite3ExprSim
efe0: 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78  plifiedAndOr(pEx
eff0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
f000: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
f010: 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69  qlite3ExprSimpli
f020: 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d  fiedAndOr(pExpr-
f030: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
f040: 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
f050: 70 4c 65 66 74 29 20 7c 7c 20 45 78 70 72 41 6c  pLeft) || ExprAl
f060: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
f070: 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  ) ){.      pExpr
f080: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
f090: 5f 41 4e 44 20 3f 20 70 52 69 67 68 74 20 3a 20  _AND ? pRight : 
f0a0: 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pLeft;.    }else
f0b0: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 54   if( ExprAlwaysT
f0c0: 72 75 65 28 70 52 69 67 68 74 29 20 7c 7c 20 45  rue(pRight) || E
f0d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
f0e0: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Left) ){.      p
f0f0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70  Expr = pExpr->op
f100: 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 4c 65 66 74  ==TK_AND ? pLeft
f110: 20 3a 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d   : pRight;.    }
f120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
f130: 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  xpr;.}.../*.** T
f140: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f150: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
f160: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
f170: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
f180: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
f190: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
f1a0: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
f1b0: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
f1c0: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
f1d0: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
f1e0: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
f1f0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
f200: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
f210: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
f220: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
f230: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
f240: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
f250: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
f260: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f270: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
f280: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f290: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
f2a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
f2b0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
f2c0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
f2d0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
f2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f2f0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
f310: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
f320: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f330: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
f340: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
f350: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
f360: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
f370: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
f380: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
f390: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
f3a0: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
f3b0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
f3c0: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
f3d0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
f3e0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
f3f0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
f400: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
f410: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
f420: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
f430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
f440: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
f450: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
f460: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
f470: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
f480: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
f490: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
f4a0: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
f4b0: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
f4c0: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
f4d0: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
f4e0: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
f4f0: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
f500: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
f510: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
f520: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
f530: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f540: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
f550: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
f560: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
f570: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
f580: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
f590: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
f5a0: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
f5b0: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
f5c0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
f5d0: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
f5e0: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
f5f0: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
f600: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
f610: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
f620: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
f630: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
f640: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
f650: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
f660: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
f670: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
f680: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
f690: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
f6a0: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
f6b0: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
f6c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
f6d0: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
f6e0: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
f6f0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
f700: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
f710: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
f720: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
f730: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
f740: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f750: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
f760: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
f770: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
f780: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
f790: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
f7a0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
f7b0: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
f7c0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
f7d0: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
f7e0: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
f7f0: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
f800: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
f810: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
f820: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
f830: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
f840: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
f850: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f860: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
f870: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
f880: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
f890: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f8a0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
f8b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f8c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f8d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
f8e0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f8f0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
f900: 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20  TK_ID:.      /* 
f910: 43 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f  Convert "true" o
f920: 72 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44  r "false" in a D
f930: 45 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e  EFAULT clause in
f940: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
f950: 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54  appropriate TK_T
f960: 52 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f  RUEFALSE operato
f970: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  r */.      if( s
f980: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
f990: 75 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ueFalse(pExpr) )
f9a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f9b0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
f9c0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
f9d0: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
f9e0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
f9f0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
fa00: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
fa10: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
fa20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fa30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
fa40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
fa50: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fa60: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
fa70: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
fa80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
fa90: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
faa0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fab0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
fac0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
fad0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fae0: 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43  pExpr, EP_FixedC
faf0: 6f 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e  ol) && pWalker->
fb00: 65 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20  eCode!=2 ){.    
fb10: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
fb20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
fb30: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
fb40: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20  er->eCode==3 && 
fb50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
fb60: 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29  Walker->u.iCur )
fb70: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
fb80: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
fb90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
fba0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
fbb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e      case TK_IF_N
fbc0: 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73  ULL_ROW:.    cas
fbd0: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20  e TK_REGISTER:. 
fbe0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fbf0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
fc00: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74  ISTER );.      t
fc10: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fc20: 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  op==TK_IF_NULL_R
fc30: 4f 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c  OW );.      pWal
fc40: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
fc50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
fc60: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65  _Abort;.    case
fc70: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
fc80: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
fc90: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
fca0: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
fcb0: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
fcc0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
fcd0: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
fce0: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
fcf0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
fd00: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
fd10: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
fd20: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
fd30: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
fd40: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
fd50: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
fd60: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
fd70: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
fd80: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
fd90: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
fda0: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
fdb0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
fdc0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
fdd0: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
fde0: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
fdf0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
fe00: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
fe10: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
fe20: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
fe30: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
fe40: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
fe50: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
fe60: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
fe70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
fe80: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fe90: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
fea0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c  ); /* sqlite3Sel
feb0: 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69  ectWalkFail() di
fec0: 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20  sallows */.     
fed0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fee0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
fef0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c  ); /* sqlite3Sel
ff00: 65 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69  ectWalkFail() di
ff10: 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20  sallows */.     
ff20: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
ff30: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
ff40: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
ff50: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
ff60: 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43  initFlag, int iC
ff70: 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ur){.  Walker w;
ff80: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69  .  w.eCode = ini
ff90: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
ffa0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
ffb0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
ffc0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ffd0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
ffe0: 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
fff0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10000 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10010 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
10020 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
10030 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43  .#endif.  w.u.iC
10040 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
10050 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
10060 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
10070 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
10080 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10090 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
100a0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
100b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
100c0 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
100d0 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
100e0 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
100f0 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
10100 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
10110 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
10120 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
10130 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
10140 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
10150 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
10160 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
10170 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
10180 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
10190 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
101a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
101b0 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
101c0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
101d0 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
101e0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
101f0 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
10200 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
10210 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20  n-zero if.**.** 
10220 20 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73    (1) the expres
10230 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10240 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74  , and.**   (2) t
10250 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  he expression do
10260 65 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  es originate in 
10270 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
10280 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
10290 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
102a0 61 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65  and.**   (3) the
102b0 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
102c0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
102d0 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f   EP_FixedCol TK_
102e0 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20  COLUMN.**       
102f0 6f 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64  operands created
10300 20 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74   by the constant
10310 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74   propagation opt
10320 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  imization..**.**
10330 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
10340 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c  ne returns true,
10350 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68   it indicates th
10360 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
10370 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65  n.** can be adde
10380 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
10390 3e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  >pConstExpr list
103a0 20 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f   and evaluated o
103b0 6e 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nce when.** the 
103c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
103d0 6e 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53  nt starts up.  S
103e0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ee sqlite3ExprCo
103f0 64 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69  deAtInit()..*/.i
10400 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10410 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
10420 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
10430 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10440 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
10450 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
10460 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
10470 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
10480 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10490 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
104a0 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20   any single row 
104b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
104c0 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20  h cursor iCur.  
104d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
104e0 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
104f0 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72  n must not refer
10500 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65   to any non-dete
10510 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
10520 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61  on nor any.** ta
10530 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ble other than i
10540 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Cur..*/.int sqli
10550 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
10560 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20  nstant(Expr *p, 
10570 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74  int iCur){.  ret
10580 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
10590 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a  p, 3, iCur);.}..
105a0 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
105b0 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
105c0 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  k used by sqlite
105d0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
105e0 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73  rGroupBy()..*/.s
105f0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
10600 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  deIsConstantOrGr
10610 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57  oupBy(Walker *pW
10620 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
10630 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  pr){.  ExprList 
10640 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c  *pGroupBy = pWal
10650 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b  ker->u.pGroupBy;
10660 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
10670 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
10680 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61  s identical to a
10690 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
106a0 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65  . If so, conside
106b0 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61  r.  ** it consta
106c0 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  nt.  */.  for(i=
106d0 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
106e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
106f0 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70  Expr *p = pGroup
10700 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
10710 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
10720 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45  xprCompare(0, pE
10730 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b  xpr, p, -1)<2 ){
10740 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
10750 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10760 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61  xprNNCollSeq(pWa
10770 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29  lker->pParse, p)
10780 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
10790 74 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c  te3IsBinary(pCol
107a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
107b0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
107c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
107d0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
107e0 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
107f0 73 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63  select. If so, c
10800 6f 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61  onsider it varia
10810 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78  ble. */.  if( Ex
10820 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
10830 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
10840 74 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  t) ){.    pWalke
10850 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
10860 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
10870 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rt;.  }..  retur
10880 6e 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  n exprNodeIsCons
10890 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45  tant(pWalker, pE
108a0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  xpr);.}../*.** W
108b0 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  alk the expressi
108c0 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61  on tree passed a
108d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
108e0 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e  ment. Return non
108f0 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20  -zero.** if the 
10900 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69  expression consi
10910 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
10920 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70  constants or cop
10930 69 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a  ies of terms .**
10940 20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61   in pGroupBy tha
10950 74 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20  t sort with the 
10960 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e  BINARY collation
10970 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10980 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10990 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
109a0 6e 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20  ne if a term of 
109b0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
109c0 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d  e can.** be prom
109d0 6f 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48  oted into the WH
109e0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20  ERE clause.  In 
109f0 6f 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61  order for such a
10a00 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f   promotion to wo
10a10 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  rk,.** the value
10a20 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
10a30 6c 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20  lause term must 
10a40 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  be the same for 
10a50 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a  all members of.*
10a60 2a 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68  * a "group".  Th
10a70 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68  e requirement th
10a80 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
10a90 74 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e  term must be BIN
10aa0 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74  ARY.** assumes t
10ab0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c  hat no other col
10ac0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10ad0 77 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65  will have a fine
10ae0 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f  r-grained.** gro
10af0 75 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72  uping than binar
10b00 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
10b10 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20  ds (A=B COLLATE 
10b20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a  binary) implies.
10b30 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20  ** A=B in every 
10b40 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20  other collating 
10b50 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72  sequence.  The r
10b60 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
10b70 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20  the.** GROUP BY 
10b80 62 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72  be BINARY is str
10b90 69 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73  icter than neces
10ba0 73 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20  sary.  It would 
10bb0 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20  also work.** to 
10bc0 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63  promote HAVING c
10bd0 6c 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20  lauses that use 
10be0 74 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61  the same alterna
10bf0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  tive collating.*
10c00 2a 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68  * sequence as th
10c10 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c  e GROUP BY term,
10c20 20 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63   but that is muc
10c30 68 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63  h harder to chec
10c40 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76  k,.** alternativ
10c50 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
10c60 65 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d  ences are uncomm
10c70 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  on, and this is 
10c80 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d  only an.** optim
10c90 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74  ization, so we t
10ca0 61 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79  ake the easy way
10cb0 20 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20   out and simply 
10cc0 72 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47  require the.** G
10cd0 52 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74  ROUP BY to use t
10ce0 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  he BINARY collat
10cf0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
10d00 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10d10 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
10d20 70 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  pBy(Parse *pPars
10d30 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72  e, Expr *p, Expr
10d40 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b  List *pGroupBy){
10d50 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10d60 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
10d70 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
10d80 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10d90 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77  ntOrGroupBy;.  w
10da0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
10db0 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f   = 0;.  w.u.pGro
10dc0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
10dd0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
10de0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
10df0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
10e00 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
10e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
10e20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
10e30 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
10e40 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
10e50 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
10e60 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
10e70 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
10e80 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
10e90 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
10ea0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
10eb0 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
10ec0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
10ed0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
10ee0 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
10ef0 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10f00 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
10f10 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
10f20 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
10f30 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
10f40 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
10f50 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
10f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10f70 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
10f80 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20  nction(Expr *p, 
10f90 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73  u8 isInit){.  as
10fa0 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20  sert( isInit==0 
10fb0 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a  || isInit==1 );.
10fc0 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10fd0 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74  onst(p, 4+isInit
10fe0 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  , 0);.}..#ifdef 
10ff0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
11000 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
11010 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
11020 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
11030 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
11040 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
11050 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20  .** subquery of 
11060 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75  some kind.  Retu
11070 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72  rn 0 if there ar
11080 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e  e no subqueries.
11090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
110a0 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75  xprContainsSubqu
110b0 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ery(Expr *p){.  
110c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
110d0 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
110e0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
110f0 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
11100 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
11110 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
11120 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23  electWalkFail;.#
11130 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
11140 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  UG.  w.xSelectCa
11150 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65  llback2 = sqlite
11160 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
11170 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t2;.#endif.  sql
11180 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
11190 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
111a0 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  eCode==0;.}.#end
111b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
111c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
111d0 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
111e0 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
111f0 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
11200 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
11210 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
11220 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
11230 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
11240 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
11250 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
11260 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
11270 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
11280 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
11290 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
112a0 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
112b0 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
112c0 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
112d0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
112e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
112f0 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
11300 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
11310 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
11320 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
11330 74 75 72 6e 20 30 3b 20 20 2f 2a 20 55 73 65 64  turn 0;  /* Used
11340 20 74 6f 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   to only happen 
11350 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d  following on OOM
11360 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
11370 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
11380 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
11390 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
113a0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
113b0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
113c0 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
113d0 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
113e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
113f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
11400 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
11410 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
11420 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
11430 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
11440 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
11450 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
11460 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
11470 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
11480 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
11490 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
114a0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
114b0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
114c0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
114d0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
114e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
114f0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
11500 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
11510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11520 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
11530 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
11540 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
11550 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
11560 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
11570 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
11580 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
11590 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
115a0 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
115b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
115c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
115d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
115e0 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
115f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11610 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
11620 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
11630 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11640 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
11650 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
11660 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
11670 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
11680 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
11690 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
116a0 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
116b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
116c0 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
116d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
116e0 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
116f0 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
11700 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
11710 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11720 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
11730 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
11740 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
11750 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
11760 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
11770 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
11780 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
11790 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
117a0 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
117b0 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
117c0 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
117d0 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
117e0 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
117f0 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
11800 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
11810 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
11820 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
11830 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
11840 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
11850 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
11860 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
11870 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
11880 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
11890 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
118a0 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
118b0 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
118c0 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20  ==TK_UMINUS ){. 
118d0 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b     p = p->pLeft;
118e0 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  .  }.  op = p->o
118f0 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
11900 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
11910 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
11920 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
11930 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
11940 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
11950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
11960 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
11970 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
11980 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
11990 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
119a0 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
119b0 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
119c0 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
119d0 20 20 20 20 20 20 20 20 70 2d 3e 79 2e 70 54 61          p->y.pTa
119e0 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65  b==0 ||  /* Refe
119f0 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20  rence to column 
11a00 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72  of index on expr
11a10 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
11a20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75         (p->iColu
11a30 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70 54  mn>=0 && p->y.pT
11a40 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
11a50 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
11a60 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
11a70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11a80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11a90 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
11aa0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
11ab0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
11ac0 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
11ad0 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
11ae0 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
11af0 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
11b00 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
11b10 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
11b20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11b30 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
11b40 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
11b50 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
11b60 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
11b70 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
11b80 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
11b90 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
11ba0 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
11bb0 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
11bc0 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
11bd0 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
11be0 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
11bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c00 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
11c10 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
11c20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
11c30 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
11c40 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
11c50 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
11c60 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
11c70 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
11c80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
11c90 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
11ca0 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
11cb0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
11cc0 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
11cd0 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
11ce0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
11cf0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
11d00 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11d10 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
11d20 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
11d30 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
11d40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11d50 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
11d60 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
11d70 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
11d80 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
11d90 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
11da0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
11db0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
11dc0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11dd0 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
11de0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
11df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
11e00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11e10 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
11e20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
11e30 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
11e40 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
11e50 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
11e60 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
11e70 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
11e80 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
11e90 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
11ea0 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
11eb0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
11ec0 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
11ed0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11ee0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
11ef0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11f00 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
11f10 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
11f20 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
11f30 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
11f40 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
11f50 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
11f60 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11f70 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
11f80 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
11f90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11fa0 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
11fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
11fc0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11fd0 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
11fe0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
11ff0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12000 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
12010 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
12020 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
12030 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12040 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
12050 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
12060 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
12070 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
12080 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
12090 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
120a0 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
120b0 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
120c0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
120d0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
120e0 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
120f0 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
12100 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
12110 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
12120 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
12130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12140 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
12150 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
12160 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
12170 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
12180 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
12190 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
121a0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
121b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
121c0 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
121d0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
121e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
121f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
12200 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
12210 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
12220 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
12230 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
12240 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
12250 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
12260 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
12270 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
12280 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12290 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
122a0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
122b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
122c0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
122d0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
122e0 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
122f0 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
12300 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
12310 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
12320 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
12330 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
12340 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12350 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12360 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
12370 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
12380 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
12390 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
123a0 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
123b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
123c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
123d0 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
123e0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
123f0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
12400 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
12410 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
12420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12430 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
12440 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
12450 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
12460 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
12470 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
12480 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
12490 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
124a0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
124b0 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
124c0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
124d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
124e0 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
124f0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
12500 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
12510 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
12520 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
12530 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
12540 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
12550 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
12560 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
12570 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
12580 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
12590 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
125a0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
125b0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
125c0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
125d0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
125e0 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
125f0 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
12600 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12610 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
12620 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
12630 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
12640 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72   /* All SELECT r
12650 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63  esults must be c
12660 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72  olumns. */.  for
12670 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
12680 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12690 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45   Expr *pRes = pE
126a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
126b0 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  ;.    if( pRes->
126c0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
126d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73  return 0;.    as
126e0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
126f0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
12700 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
12710 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
12720 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
12730 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e   return p;.}.#en
12740 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12750 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
12760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12770 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
12780 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12790 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65   that checks the
127a0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
127b0 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65  n of index table
127c0 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a   iCur to see if.
127d0 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  ** it contains a
127e0 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e  ny NULL entries.
127f0 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69    Cause the regi
12800 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75  ster at regHasNu
12810 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20  ll to be set.** 
12820 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  to a non-NULL va
12830 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74  lue if iCur cont
12840 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20  ains no NULLs.  
12850 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72  Cause register r
12860 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  egHasNull.** to 
12870 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
12880 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
12890 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
128a0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
128b0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
128c0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64  etHasNullFlag(Vd
128d0 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c  be *v, int iCur,
128e0 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29   int regHasNull)
128f0 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  {.  int addr1;. 
12900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12910 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12920 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
12930 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12940 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12950 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
12960 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12970 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
12980 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
12990 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72  lumn, iCur, 0, r
129a0 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71  egHasNull);.  sq
129b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
129c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45  5(v, OPFLAG_TYPE
129d0 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f  OFARG);.  VdbeCo
129e0 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74  mment((v, "first
129f0 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20  _entry_in(%d)", 
12a00 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  iCur));.  sqlite
12a10 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12a20 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69   addr1);.}.#endi
12a30 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
12a40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12a50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
12a60 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ent is an IN ope
12a70 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73  rator with a lis
12a80 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
12a90 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69  y) on the .** ri
12aa0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20  ght-hand side.  
12ab0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
12ac0 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73  hat list is cons
12ad0 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tant..*/.static 
12ae0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73  int sqlite3InRhs
12af0 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
12b00 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  *pIn){.  Expr *p
12b10 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  LHS;.  int res;.
12b20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
12b30 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20  asProperty(pIn, 
12b40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
12b50 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70  .  pLHS = pIn->p
12b60 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  Left;.  pIn->pLe
12b70 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20  ft = 0;.  res = 
12b80 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12b90 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49  stant(pIn);.  pI
12ba0 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b  n->pLeft = pLHS;
12bb0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12be0 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
12bf0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
12c00 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
12c10 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
12c20 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
12c30 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
12c40 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12c50 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
12c60 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
12c70 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
12c80 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
12c90 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
12ca0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
12cb0 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
12cc0 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
12cd0 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
12ce0 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
12cf0 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
12d00 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
12d10 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
12d20 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
12d30 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
12d40 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
12d50 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
12d60 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
12d70 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
12d80 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
12d90 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20  ect that is the 
12da0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12db0 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58  erator.** and pX
12dc0 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  ->iTable is set 
12dd0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
12de0 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  that cursor..**.
12df0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
12e00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
12e10 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
12e20 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
12e30 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12e40 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
12e50 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20  OWID      - The 
12e60 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
12e70 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
12e80 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12e90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20  NDEX_INDEX_ASC  
12ea0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12eb0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73   opened on an as
12ec0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
12ed0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12ee0 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75  EX_DESC - The cu
12ef0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12f00 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
12f10 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
12f20 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20  NDEX_EPH        
12f30 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12f40 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
12f50 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
12f60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
12f80 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
12f90 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  l table..**   IN
12fa0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20  _INDEX_NOOP     
12fb0 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61    - No cursor wa
12fc0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68  s allocated.  Th
12fd0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  e IN operator mu
12fe0 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  st be.**        
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
13010 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  a sequence of co
13020 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  mparisons..**.**
13030 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
13040 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65  ree might be use
13050 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70  d if the RHS exp
13060 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20  ression pX is a 
13070 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65  simple.** subque
13080 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a  ry such as:.**.*
13090 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
130a0 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32  lumn1>, <column2
130b0 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  >... FROM <table
130c0 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
130d0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
130e0 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
130f0 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
13100 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
13110 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
13120 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
13130 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
13140 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
13150 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
13160 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
13170 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
13180 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
13190 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
131a0 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
131b0 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
131c0 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
131d0 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d  tain, at a minim
131e0 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  um, one of the b
131f0 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
13200 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
13210 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20  _INDEX_LOOP but 
13220 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e  not both.  If in
13230 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
13240 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
13250 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
13260 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
13270 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
13280 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65   a fast.** membe
13290 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
132a0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
132b0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
132c0 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c  the IN index wil
132d0 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  l.** be used to 
132e0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
132f0 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
13300 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13310 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  or..**.** When I
13320 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20  N_INDEX_LOOP is 
13330 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
13340 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
13350 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
13360 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
13370 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68  members) then th
13380 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f  e b-tree must no
13390 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63  t contain duplic
133a0 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65  ates..** An ephe
133b0 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  remal table will
133c0 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65   be created unle
133d0 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
133e0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
133f0 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
13400 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
13410 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
13420 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13430 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
13440 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
13450 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
13460 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
13470 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
13480 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
13490 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
134a0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
134b0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
134c0 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
134d0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
134e0 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
134f0 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
13500 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
13510 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
13520 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
13530 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
13540 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
13550 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
13560 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
13570 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
13580 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
13590 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
135a0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
135b0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
135c0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
135d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
135e0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
135f0 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
13600 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
13610 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
13620 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
13630 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
13640 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
13650 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
13660 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
13670 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
13680 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
13690 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
136a0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
136b0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
136c0 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
136d0 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
136e0 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
136f0 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
13700 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
13710 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
13720 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
13730 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
13740 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
13750 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
13760 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
13770 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
13780 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13790 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
137a0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
137b0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
137c0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
137d0 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
137e0 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
137f0 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
13800 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
13810 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
13820 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
13830 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
13840 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
13850 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
13860 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
13870 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
13880 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
13890 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
138a0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
138b0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
138c0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
138d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
138e0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
138f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
13900 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
13910 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
13920 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
13930 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
13940 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
13950 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
13960 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
13970 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
13980 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
13990 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
139a0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
139b0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
139c0 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
139d0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
139e0 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
139f0 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
13a00 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
13a10 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
13a20 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
13a30 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
13a40 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
13a50 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13a60 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
13a70 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
13a80 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
13a90 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
13aa0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
13ab0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
13ac0 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
13ad0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
13ae0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
13af0 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
13b00 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
13b10 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
13b20 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
13b30 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
13b40 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
13b50 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
13b60 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
13b70 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
13b80 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
13b90 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
13ba0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
13bb0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
13bc0 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
13bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13be0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
13bf0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
13c00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
13c10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
13c20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13c30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
13c40 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pX,             
13c50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
13c60 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
13c70 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  ) of the IN oper
13c80 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e  ator */.  u32 in
13c90 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
13ca0 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58       /* IN_INDEX
13cb0 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48  _LOOP, _MEMBERSH
13cc0 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50  IP, and/or _NOOP
13cd0 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72  _OK */.  int *pr
13ce0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20  RhsHasNull,     
13cf0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
13d00 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61  holding NULL sta
13d10 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20  tus.  See notes 
13d20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 2c  */.  int *aiMap,
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
13d50 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20  Index fields to 
13d60 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20  RHS fields */.  
13d70 69 6e 74 20 2a 70 69 54 61 62 20 20 20 20 20 20  int *piTab      
13d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
13d90 54 3a 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  T: index to use 
13da0 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
13db0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13dd0 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72   SELECT to the r
13de0 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61  ight of IN opera
13df0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  tor */.  int eTy
13e00 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e20 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61  * Type of RHS ta
13e30 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20  ble. IN_INDEX_* 
13e40 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
13e50 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
13e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
13e70 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20  rsor of the RHS 
13e80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
13e90 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20  ustBeUnique;    
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20   /* True if RHS 
13ec0 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a  must be unique *
13ed0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
13ee0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13ef0 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72  rse);     /* Vir
13f00 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
13f10 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61  ng coded */..  a
13f20 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
13f30 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65  K_IN );.  mustBe
13f40 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67  Unique = (inFlag
13f50 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
13f60 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  P)!=0;..  /* If 
13f70 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20  the RHS of this 
13f80 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
13f90 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e   is a SELECT, an
13fa0 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20  d if it matters 
13fb0 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
13fc0 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20   not the SELECT 
13fd0 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20  result contains 
13fe0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65  NULL values, che
13ff0 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  ck whether.  ** 
14000 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61  or not NULL is a
14010 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
14020 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c   (it may not be,
14030 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75   for example, du
14040 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e  e .  ** to NOT N
14050 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
14060 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20  in the schema). 
14070 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  If no NULL value
14080 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a  s are possible,.
14090 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61    ** set prRhsHa
140a0 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72  sNull to 0 befor
140b0 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a  e continuing.  *
140c0 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73  /.  if( prRhsHas
140d0 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61  Null && (pX->fla
140e0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
140f0 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  t) ){.    int i;
14100 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
14110 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53  EList = pX->x.pS
14120 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
14130 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
14140 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
14160 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
14170 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  l(pEList->a[i].p
14180 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Expr) ) break;. 
14190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
141a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
141b0 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e  .      prRhsHasN
141c0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ull = 0;.    }. 
141d0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
141e0 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
141f0 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
14200 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
14210 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
14220 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
14230 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
14240 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
14250 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
14260 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
14270 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14280 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61  ==0 && (p = isCa
14290 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
142a0 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  pX))!=0 ){.    s
142b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
142c0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
142d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
142e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
142f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
14320 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
14330 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20      i16 iDb;    
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
14360 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
14370 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  Tab */.    ExprL
14380 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
14390 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  >pEList;.    int
143a0 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
143b0 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  >nExpr;..    ass
143c0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
143d0 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
143e0 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
143f0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
14400 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
14410 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
14420 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
14430 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
14440 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
14450 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
14460 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
14470 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14480 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
14490 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
144a0 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
144b0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
144c0 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20  ].pTab;..    /* 
144d0 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73  Code an OP_Trans
144e0 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61  action and OP_Ta
144f0 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62  bleLock for <tab
14500 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20  le>. */.    iDb 
14510 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
14520 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
14530 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
14540 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14550 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
14560 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
14570 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14580 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14590 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
145a0 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  e);..    assert(
145b0 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47  v);  /* sqlite3G
145c0 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77  etVdbe() has alw
145d0 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ays been previou
145e0 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20  sly called */.  
145f0 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
14600 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
14610 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
14620 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
14630 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f  "x IN (SELECT ro
14640 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22  wid FROM table)"
14650 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69   case */.      i
14660 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
14670 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14680 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  OP_Once);.      
14690 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
146a0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
146b0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
146c0 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
146d0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
146e0 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
146f0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
14700 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
14710 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
14720 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 53  .            "US
14730 49 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43 48  ING ROWID SEARCH
14740 20 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52   ON TABLE %s FOR
14750 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54   IN-OPERATOR",pT
14760 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
14770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14780 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
14790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
147a0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147d0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
147e0 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
147f0 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20  ty_ok = 1;.     
14800 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f   int i;..      /
14810 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
14820 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
14830 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
14840 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20  erform each .   
14850 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
14860 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
14870 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
14880 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
14890 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  able.      ** on
148a0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
148b0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
148c0 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   it not, it is n
148d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20  ot possible to. 
148e0 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20       ** use any 
148f0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53  index of the RHS
14900 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
14910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
14920 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  pr && affinity_o
14930 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
14940 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
14950 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
14960 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
14970 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
14980 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74  nt iCol = pEList
14990 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[i].pExpr->iC
149a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63  olumn;.        c
149b0 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c  har idxaff = sql
149c0 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
149d0 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f  ffinity(pTab,iCo
149e0 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65  l); /* RHS table
149f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
14a00 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65   cmpaff = sqlite
14a10 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14a20 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a  (pLhs, idxaff);.
14a30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14a40 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
14a50 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
14a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63       testcase( c
14a70 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  mpaff==SQLITE_AF
14a80 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
14a90 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
14aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
14ab0 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
14ac0 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
14ad0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14ae0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
14af0 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
14b00 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d     /* sqlite3Com
14b10 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f  pareAffinity() o
14b20 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54  nly returns TEXT
14b30 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   if one side or 
14b40 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
14b50 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20  ** other has no 
14b60 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65  affinity and the
14b70 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54   other side is T
14b80 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20  EXT.  Hence,.   
14b90 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
14ba0 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70  only way for cmp
14bb0 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69  aff to be TEXT i
14bc0 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20  s for idxaff to 
14bd0 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20  be TEXT.        
14be0 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74      ** and for t
14bf0 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c  he term on the L
14c00 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20  HS of the IN to 
14c10 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79  have no affinity
14c20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
14c30 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d   assert( idxaff=
14c40 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
14c50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14c60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14c70 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
14c80 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f        affinity_o
14c90 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  k = sqlite3IsNum
14ca0 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
14cb0 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aff);.        }.
14cc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
14cd0 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
14ce0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  {.        /* Sea
14cf0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
14d00 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
14d10 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69  ill work for thi
14d20 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
14d30 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
14d40 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
14d50 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
14d60 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
14d70 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42  xt){.          B
14d80 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20  itmask colUsed; 
14d90 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
14da0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  of the index use
14db0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42  d */.          B
14dc0 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20  itmask mCol;    
14dd0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72       /* Mask for
14de0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
14df0 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  umn */.         
14e00 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
14e10 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69  mn<nExpr ) conti
14e20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
14e30 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
14e40 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74  xWhere!=0 ) cont
14e50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
14e60 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
14e70 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
14e80 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
14e90 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
14ea0 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
14eb0 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
14ec0 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
14ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
14ee0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14ef0 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
14f00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14f10 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
14f20 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
14f30 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
14f40 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
14f50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14f60 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
14f70 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
14f80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
14f90 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
14fa0 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
14fb0 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
14fc0 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
14fd0 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
14fe0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
14ff0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
15000 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
15010 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
15020 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
15030 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
15040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
15050 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
15060 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
15070 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
15080 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
15090 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
150a0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
150b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
150c0 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
150d0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
150e0 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
150f0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
15100 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
15110 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
15120 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
15130 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
15140 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
15150 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
15160 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
15170 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
15180 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
15190 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
151a0 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
151b0 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
151c0 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
151d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
151e0 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
151f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15200 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
15210 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
15220 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
15230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
15240 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
15250 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
15260 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
15270 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
15280 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
15290 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
152a0 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
152b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
152c0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
152d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
152e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
152f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15300 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
15310 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
15320 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
15330 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
15340 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
15350 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
15360 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
15370 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
15380 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
15390 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
153a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
153b0 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
153c0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
153d0 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
153e0 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
153f0 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
15400 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
15410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
15420 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
15430 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
15440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
15450 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
15460 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
15470 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
15480 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
15490 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
154a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
154b0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
154c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
154d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  );.            E
154e0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
154f0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e 47            "USING
15520 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e   INDEX %s FOR IN
15530 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d  -OPERATOR",pIdx-
15540 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
15550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15560 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
15570 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
15580 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
15590 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
155a0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
155b0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
155c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
155d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
155e0 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
155f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
15600 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
15610 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
15620 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
15630 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
15640 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
15650 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
15660 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
15670 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  [0];.  .        
15680 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
15690 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  Null ){.#ifdef S
156a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
156b0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
156c0 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
156d0 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
156e0 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
156f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15700 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
15710 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20  olumnsUsed, .   
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15730 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29  Tab, 0, 0, (u8*)
15740 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29  &mask, P4_INT64)
15750 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
15760 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
15770 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
15780 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
15790 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d       if( nExpr==
157a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
157b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
157c0 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
157d0 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
157e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
157f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
15800 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
15810 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15820 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
15830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15840 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
15850 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ver indexes */. 
15860 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66       } /* End if
15870 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20  ( affinity_ok ) 
15880 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  */.    } /* End 
15890 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20  if not an rowid 
158a0 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20  index */.  } /* 
158b0 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  End attempt to o
158c0 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e  ptimize using an
158d0 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20   index */..  /* 
158e0 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e  If no preexistin
158f0 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c  g index is avail
15900 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20  able for the IN 
15910 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20  clause.  ** and 
15920 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
15930 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c   an allowed repl
15940 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
15950 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
15960 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c  rator is a list,
15970 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a   not a subquery.
15980 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
15990 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
159a0 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
159b0 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
159c0 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
159d0 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
159e0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
159f0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
15a00 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
15a10 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
15a20 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
15a30 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
15a40 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
15a50 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
15a60 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
15a70 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
15a80 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
15a90 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
15aa0 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
15ab0 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
15ac0 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
15ad0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
15ae0 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  EX_NOOP;.  }..  
15af0 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
15b00 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
15b10 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
15b20 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
15b30 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
15b40 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
15b50 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
15b60 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
15b70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
15b80 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
15b90 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
15ba0 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
15bb0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
15bc0 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
15bd0 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
15be0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15bf0 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
15c00 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
15c10 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
15c20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
15c30 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
15c40 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
15c50 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
15c60 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
15c70 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
15c80 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
15c90 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
15ca0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
15cb0 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f   sqlite3CodeRhsO
15cc0 66 49 4e 28 70 50 61 72 73 65 2c 20 70 58 2c 20  fIN(pParse, pX, 
15cd0 69 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72  iTab);.    if( r
15ce0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
15cf0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
15d00 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
15d10 61 62 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  ab, rMayHaveNull
15d20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
15d30 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15d40 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
15d50 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  p;.  }..  if( ai
15d60 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
15d70 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
15d80 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15d90 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
15da0 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
15db0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
15dc0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
15dd0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
15de0 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
15df0 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
15e00 20 7d 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54   }.  *piTab = iT
15e10 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79  ab;.  return eTy
15e20 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  pe;.}.#endif..#i
15e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15e40 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
15e50 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20   Argument pExpr 
15e60 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20  is an (?, ?...) 
15e70 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
15e80 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  on. This .** fun
15e90 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
15ea0 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75  and returns a nu
15eb0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
15ec0 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ing containing .
15ed0 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  ** the affinitie
15ee0 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  s to be used for
15ef0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
15f00 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
15f10 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
15f20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15f30 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
15f40 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
15f50 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69  returned.** stri
15f60 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ng is eventually
15f70 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
15f80 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f  ite3DbFree()..*/
15f90 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
15fa0 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72  prINAffinity(Par
15fb0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
15fc0 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
15fd0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
15fe0 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56  >pLeft;.  int nV
15ff0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
16000 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
16010 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  );.  Select *pSe
16020 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66  lect = (pExpr->f
16030 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
16040 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
16050 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
16060 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
16070 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
16080 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
16090 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
160a0 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
160b0 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
160c0 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
160d0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
160e0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
160f0 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
16100 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
16110 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
16120 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
16130 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
16140 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
16150 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
16160 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
16170 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
16180 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
16190 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
161a0 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
161b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
161c0 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
161d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
161e0 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
161f0 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
16200 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
16210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16220 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
16230 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
16240 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
16250 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
16260 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
16270 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
16280 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
16290 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
162a0 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
162b0 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
162c0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
162d0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
162e0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
162f0 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
16300 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
16310 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
16320 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
16330 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
16340 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
16350 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16360 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
16370 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
16380 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
16390 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
163a0 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
163b0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
163c0 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
163d0 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
163e0 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
163f0 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
16400 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
16410 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
16420 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
16430 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
16440 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
16450 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
16460 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
16470 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
16480 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
16490 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
164a0 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
164b0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
164c0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
164d0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
164e0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
164f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16500 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
16510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16520 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
16530 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
16540 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
16550 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
16560 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
16570 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
16580 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
16590 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
165a0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
165b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
165c0 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
165d0 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d  misused");.  }.}
165e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
165f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
16600 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16610 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e  de that will con
16620 73 74 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65  struct an epheme
16630 72 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ral table contai
16640 6e 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a  ning all terms.*
16650 2a 20 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * in the RHS of 
16660 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
16670 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
16680 20 63 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65   can be in eithe
16690 72 20 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d  r of two.** form
166a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49  s:.**.**     x I
166b0 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
166c0 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
166d0 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
166e0 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
166f0 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
16700 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
16710 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
16720 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
16730 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
16740 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
16750 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
16760 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54   IN operator.  T
16770 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
16780 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73   for the.** cons
16790 74 72 75 63 74 65 64 20 65 70 68 65 72 6d 65 72  tructed ephermer
167a0 61 6c 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  al table is retu
167b0 72 6e 65 64 2e 20 20 54 68 65 20 66 69 72 73 74  rned.  The first
167c0 20 74 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65   time the epheme
167d0 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ral.** table is 
167e0 63 6f 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75  computed, the cu
167f0 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61  rsor number is a
16800 6c 73 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45  lso stored in pE
16810 78 70 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20  xpr->iTable,.** 
16820 68 6f 77 65 76 65 72 20 74 68 65 20 63 75 72 73  however the curs
16830 6f 72 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  or number return
16840 65 64 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ed might not be 
16850 74 68 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20  the same, as it 
16860 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65  might.** have be
16870 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 75 73  en duplicated us
16880 69 6e 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a  ing OP_OpenDup..
16890 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53  **.** If the LHS
168a0 20 65 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22   expression ("x"
168b0 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73   in the examples
168c0 29 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  ) is a column va
168d0 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53  lue, or.** the S
168e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
168f0 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
16900 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
16910 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
16920 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75  t.** column is u
16930 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
16940 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
16950 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
16960 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  .** SELECT... st
16970 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
16980 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
16990 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
169a0 65 64 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20  ed.** if either 
169b0 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
169c0 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
169d0 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
169e0 65 72 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68  er.** 'x' nor th
169f0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
16a00 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16a10 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
16a20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75  affinity.** is u
16a30 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
16a40 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28  ite3CodeRhsOfIN(
16a50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16a60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
16a70 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16a80 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
16a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16aa0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
16ab0 0a 20 20 69 6e 74 20 69 54 61 62 20 20 20 20 20  .  int iTab     
16ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
16ad0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75  e this cursor nu
16ae0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
16af0 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20   addrOnce = 0;  
16b00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16b10 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 6e  ess of the OP_On
16b20 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  ce instruction a
16b30 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61  t top */.  int a
16b40 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
16b50 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16b60 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
16b70 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
16b80 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  n */.  Expr *pLe
16b90 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
16ba0 20 20 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66     /* the LHS of
16bb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16bc0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16bd0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
16be0 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
16bf0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
16c00 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16c10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16c20 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
16c30 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c50 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
16c60 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
16c70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
16c80 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
16c90 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
16ca0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  !=0 );..  /* The
16cb0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74   evaluation of t
16cc0 68 65 20 49 4e 20 6d 75 73 74 20 62 65 20 72 65  he IN must be re
16cd0 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d  peated every tim
16ce0 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63  e it.  ** is enc
16cf0 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20  ountered if any 
16d00 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16d10 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
16d20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
16d30 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
16d40 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
16d50 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
16d60 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
16d70 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
16d80 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
16d90 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
16da0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
16db0 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
16dc0 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
16dd0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
16de0 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
16df0 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  n we can compute
16e00 20 74 68 65 20 52 48 53 20 6a 75 73 74 20 6f 6e   the RHS just on
16e10 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75 73  ce.  ** and reus
16e20 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73 2e  e it many names.
16e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
16e40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16e50 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
16e60 29 20 26 26 20 70 50 61 72 73 65 2d 3e 69 53 65  ) && pParse->iSe
16e70 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  lfTab==0 ){.    
16e80 2f 2a 20 52 65 75 73 65 20 6f 66 20 74 68 65 20  /* Reuse of the 
16e90 52 48 53 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a  RHS is allowed *
16ea0 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  /.    /* If this
16eb0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72   routine has alr
16ec0 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c  eady been coded,
16ed0 20 62 75 74 20 74 68 65 20 70 72 65 76 69 6f 75   but the previou
16ee0 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d 69  s code.    ** mi
16ef0 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
16f00 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20 73  n invoked yet, s
16f10 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 20  o invoke it now 
16f20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  as a subroutine.
16f30 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
16f40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16f50 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74  (pExpr, EP_Subrt
16f60 6e 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  n) ){.      addr
16f70 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
16f80 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
16f90 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
16fa0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  ge(v);.      if(
16fb0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16fc0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16fd0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
16fe0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16ff0 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52  n((pParse, 0, "R
17000 45 55 53 45 20 4c 49 53 54 20 53 55 42 51 55 45  EUSE LIST SUBQUE
17010 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
17020 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
17030 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b  Select->selId));
17040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17060 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45  (v, OP_Gosub, pE
17070 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
17080 74 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  turn,.          
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
170a0 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72  xpr->y.sub.iAddr
170b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
170c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
170d0 5f 4f 70 65 6e 44 75 70 2c 20 69 54 61 62 2c 20  _OpenDup, iTab, 
170e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
170f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17100 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17110 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 72 65  rOnce);.      re
17120 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
17130 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67   /* Begin coding
17140 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17150 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  */.    ExprSetPr
17160 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17170 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45  _Subrtn);.    pE
17180 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
17190 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
171a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72  >nMem;.    pExpr
171b0 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a  ->y.sub.iAddr =.
171c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
171d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
171e0 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d  teger, 0, pExpr-
171f0 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e  >y.sub.regReturn
17200 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43  ) + 1;.    VdbeC
17210 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75  omment((v, "retu
17220 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a  rn address"));..
17230 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
17240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
17250 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
17260 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17270 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
17280 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
17290 20 61 20 76 65 63 74 6f 72 20 49 4e 20 6f 70 65   a vector IN ope
172a0 72 61 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74  rator */.  pLeft
172b0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
172c0 0a 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  nVal = sqlite
172d0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
172e0 70 4c 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pLeft);..  /* Co
172f0 6e 73 74 72 75 63 74 20 74 68 65 20 65 70 68 65  nstruct the ephe
17300 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74  meral table that
17310 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68   will contain th
17320 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a  e content of.  *
17330 2a 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  * RHS of the IN 
17340 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
17350 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
17360 20 69 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20   iTab;.  addr = 
17370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17380 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
17390 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
173a0 61 62 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69 66  able, nVal);.#if
173b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
173c0 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
173d0 54 53 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  TS.  if( ExprHas
173e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
173f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17400 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
17410 28 28 76 2c 20 22 52 65 73 75 6c 74 20 6f 66 20  ((v, "Result of 
17420 53 45 4c 45 43 54 20 25 75 22 2c 20 70 45 78 70  SELECT %u", pExp
17430 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65  r->x.pSelect->se
17440 6c 49 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lId));.  }else{.
17450 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17460 28 76 2c 20 22 52 48 53 20 6f 66 20 49 4e 20 6f  (v, "RHS of IN o
17470 70 65 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d 0a  perator"));.  }.
17480 23 65 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e 66  #endif.  pKeyInf
17490 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
174a0 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
174b0 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
174c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
174d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
174e0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
174f0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
17500 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
17510 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ...).    **.    
17520 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
17530 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
17540 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
17550 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
17560 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
17570 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
17580 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
17590 20 20 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63      */.    Selec
175a0 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78  t *pSelect = pEx
175b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
175c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
175d0 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
175e0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c  EList;..    Expl
175f0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
17600 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54  arse, 1, "%sLIST
17610 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
17620 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f         addrOnce?
17630 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
17640 2c 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64  , pSelect->selId
17650 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a 20  .    ));.    /* 
17660 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52  If the LHS and R
17670 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
17680 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74  rator do not mat
17690 63 68 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ch, that.    ** 
176a0 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20  error will have 
176b0 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67  been caught long
176c0 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68   before we reach
176d0 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
176e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
176f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56  EList->nExpr==nV
17700 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  al) ){.      Sel
17710 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
17720 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
17730 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
17740 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
17750 54 5f 53 65 74 2c 20 69 54 61 62 29 3b 0a 20 20  T_Set, iTab);.  
17760 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
17770 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
17780 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
17790 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74  );.      pSelect
177a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
177b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
177c0 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
177d0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  & SF_Distinct );
177e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
177f0 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
17800 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
17810 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
17820 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
17830 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
17840 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
17850 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
17860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
17870 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
17880 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
17890 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
178a0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
178b0 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
178c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
178d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
178e0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
178f0 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
17900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17910 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a  KeyInfo!=0 ); /*
17920 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
17930 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74  exit after sqlit
17940 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e3Select() */.  
17950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17960 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  st!=0 );.      a
17970 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
17980 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
17990 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
179a0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
179b0 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
179c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
179d0 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
179e0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
179f0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
17a00 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
17a10 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  );.        pKeyI
17a20 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
17a30 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
17a40 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20  pareCollSeq(.   
17a50 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
17a60 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
17a70 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  .pExpr.        )
17a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17a90 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17aa0 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
17ab0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20  t!=0) ){.    /* 
17ac0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
17ad0 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
17ae0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17af0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17b00 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  , build an index
17b10 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76   key from the ev
17b20 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  aluation and.   
17b30 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
17b40 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17b50 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
17b60 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
17b70 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74   use.    ** that
17b80 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
17b90 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
17ba0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
17bb0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
17bc0 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
17bd0 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
17be0 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ty..    */.    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 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
17c40 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
17c50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17c60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17c70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17c80 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
17c90 33 3b 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20  3;.    affinity 
17ca0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
17cb0 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
17cc0 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
17cd0 29 7b 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  ){.      affinit
17ce0 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
17cf0 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LOB;.    }.    i
17d00 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
17d10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
17d20 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
17d30 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
17d40 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e   );.      pKeyIn
17d50 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
17d60 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17d70 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
17d80 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a  >pLeft);.    }..
17d90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
17da0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
17db0 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
17dc0 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73  >. */.    r1 = s
17dd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17de0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
17df0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17e00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17e10 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
17e20 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
17e30 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
17e40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17e50 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
17e60 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
17e70 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
17e80 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
17e90 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
17ea0 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
17eb0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
17ec0 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
17ed0 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
17ee0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
17ef0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
17f00 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
17f10 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
17f20 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
17f30 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
17f40 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
17f50 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
17f60 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
17f70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64   */.      if( ad
17f80 64 72 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74  drOnce && !sqlit
17f90 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
17fa0 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
17fb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17fc0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
17fd0 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20 61  Once);.        a
17fe0 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ddrOnce = 0;.   
17ff0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
18000 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
18010 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
18020 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
18030 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
18040 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
18050 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
18060 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
18070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18080 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
18090 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
180a0 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
180b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
180c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
180d0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
180e0 54 61 62 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b  Tab, r2, r3, 1);
180f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
18100 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18110 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
18120 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18130 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18140 72 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r2);.  }.  if( p
18150 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 73  KeyInfo ){.    s
18160 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18170 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
18180 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
18190 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a 20  _KEYINFO);.  }. 
181a0 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b   if( addrOnce ){
181b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
181c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
181d0 4f 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53 75  Once);.    /* Su
181e0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
181f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
18200 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
18210 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e  eturn, pExpr->y.
18220 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a  sub.regReturn);.
18230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18240 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72  hangeP1(v, pExpr
18250 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c  ->y.sub.iAddr-1,
18260 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
18270 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
18280 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
18290 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
182a0 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ERY */../*.** Ge
182b0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
182c0 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
182d0 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71  s used as a subq
182e0 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a  uery expression.
182f0 2a 2a 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  ** or EXISTS ope
18300 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rator:.**.**    
18310 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
18320 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
18330 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
18340 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
18350 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
18360 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 0a  STS subquery.**.
18370 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
18380 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 53 45  ameter is the SE
18390 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f  LECT or EXISTS o
183a0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 63 6f  perator to be co
183b0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ded..**.** The r
183c0 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
183d0 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20  ds the result.  
183e0 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75  For a multi-colu
183f0 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74  mn SELECT, .** t
18400 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
18410 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
18420 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72 65 67  ous array of reg
18430 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a  isters and the.*
18440 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
18450 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
18460 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  f the left-most 
18470 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  result column..*
18480 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 61 6e  * Return 0 if an
18490 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
184a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
184b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
184c0 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
184d0 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
184e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
184f0 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f  pr){.  int addrO
18500 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
18510 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18520 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20   OP_Once at top 
18530 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  of subroutine */
18540 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18560 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
18570 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
18580 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
185b0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
185c0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
185d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
185e0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
185f0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a   SELECT result *
18600 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
18630 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78  allocate */.  Ex
18640 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20  pr *pLimit;     
18650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
18660 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
18670 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20  n */..  Vdbe *v 
18680 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18690 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
186a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
186b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
186c0 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61 73  STS );.  testcas
186d0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
186e0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73  _SELECT );.  ass
186f0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
18700 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
18710 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18720 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  T );.  assert( E
18730 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18740 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
18750 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ct) );.  pSel = 
18760 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
18770 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
18780 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  uation of the EX
18790 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74  ISTS/SELECT must
187a0 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65   be repeated eve
187b0 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20  ry time it.  ** 
187c0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
187d0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
187e0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
187f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
18800 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
18810 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
18820 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
18830 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
18840 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
18850 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
18860 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
18870 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
18880 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
18890 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
188a0 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
188b0 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
188c0 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
188d0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
188e0 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
188f0 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
18900 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
18910 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
18920 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
18930 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
18940 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18950 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
18960 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ct) ){.    /* If
18970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
18980 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
18990 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  oded, then invok
189a0 65 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a 2a  e it as a.    **
189b0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a   subroutine. */.
189c0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
189d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
189e0 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20  P_Subrtn) ){.   
189f0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
18a00 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
18a10 22 52 45 55 53 45 20 53 55 42 51 55 45 52 59 20  "REUSE SUBQUERY 
18a20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64  %d", pSel->selId
18a30 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18a40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18a50 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e  P_Gosub, pExpr->
18a60 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c  y.sub.regReturn,
18a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a80 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
18a90 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20  y.sub.iAddr);.  
18aa0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
18ab0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  ->iTable;.    }.
18ac0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
18ad0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
18ae0 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  ine */.    ExprS
18af0 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
18b00 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
18b10 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72    pExpr->y.sub.r
18b20 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
18b30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
18b40 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
18b50 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r =.      sqlite
18b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18b70 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45  P_Integer, 0, pE
18b80 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
18b90 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56  turn) + 1;.    V
18ba0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18bb0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29  return address")
18bc0 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65  );..    addrOnce
18bd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18be0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
18bf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18c00 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
18c10 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
18c20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
18c30 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
18c40 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
18c50 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
18c60 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
18c70 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
18c80 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
18c90 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  ex of.  ** the f
18ca0 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
18cb0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
18cc0 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
18cd0 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
18ce0 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
18cf0 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a  r 1 (exists).  *
18d00 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
18d10 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
18d20 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
18d30 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  r..  **.  ** In 
18d40 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
18d50 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
18d60 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
18d70 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72  ".  Any .  ** pr
18d80 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
18d90 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
18da0 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
18db0 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20   LIMIT 1..  */. 
18dc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
18dd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
18de0 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59  sSCALAR SUBQUERY
18df0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64   %d",.        ad
18e00 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45  drOnce?"":"CORRE
18e10 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73  LATED ", pSel->s
18e20 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d  elId));.  nReg =
18e30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18e40 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
18e50 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
18e60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18e70 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
18e80 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
18e90 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  1);.  pParse->nM
18ea0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66  em += nReg;.  if
18eb0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18ec0 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65  SELECT ){.    de
18ed0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
18ee0 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64  em;.    dest.iSd
18ef0 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
18f00 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73  m;.    dest.nSds
18f10 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71  t = nReg;.    sq
18f20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18f30 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
18f40 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73  est.iSDParm, des
18f50 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31  t.iSDParm+nReg-1
18f60 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
18f70 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
18f80 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
18f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
18fa0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
18fb0 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74  xists;.    sqlit
18fc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18fd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
18fe0 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
18ff0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19000 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
19010 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20  esult"));.  }.  
19020 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
19030 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
19040 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  ->db, TK_INTEGER
19050 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65  ,&sqlite3IntToke
19060 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28  ns[1], 0);.  if(
19070 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSel->pLimit ){
19080 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19090 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
190a0 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d  b, pSel->pLimit-
190b0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65  >pLeft);.    pSe
190c0 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  l->pLimit->pLeft
190d0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c   = pLimit;.  }el
190e0 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c  se{.    pSel->pL
190f0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
19100 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
19110 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29  IMIT, pLimit, 0)
19120 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c  ;.  }.  pSel->iL
19130 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  imit = 0;.  if( 
19140 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19150 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
19160 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
19170 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d   0;.  }.  pExpr-
19180 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d  >iTable = rReg =
19190 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
191a0 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
191b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
191c0 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61  Reduce);.  if( a
191d0 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73  ddrOnce ){.    s
191e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
191f0 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
19200 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74  ..    /* Subrout
19210 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  ine return */.  
19220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19230 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
19240 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
19250 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73  egReturn);.    s
19260 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19270 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73  P1(v, pExpr->y.s
19280 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69  ub.iAddr-1, sqli
19290 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
192a0 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20  dr(v)-1);.  }.. 
192b0 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
192c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
192d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
192e0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
192f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19300 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
19310 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
19320 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
19330 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
19340 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
19350 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
19360 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
19370 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
19380 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
19390 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
193a0 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
193b0 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
193c0 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
193d0 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
193e0 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
193f0 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
19400 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
19410 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
19420 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
19430 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
19440 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
19450 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
19460 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
19470 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c  ;.  if( (pIn->fl
19480 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
19490 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ct) ){.    if( n
194a0 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70  Vector!=pIn->x.p
194b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
194c0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
194d0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
194e0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e  rror(pParse, pIn
194f0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
19500 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63  ist->nExpr, nVec
19510 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tor);.      retu
19520 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
19530 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21  lse if( nVector!
19540 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
19550 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
19560 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65  pParse, pIn->pLe
19570 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ft);.    return 
19580 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
19590 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
195a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
195b0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
195c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
195d0 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
195e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
195f0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
19600 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
19610 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
19620 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
19630 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
19640 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20   is a scalar or 
19650 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
19660 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68  n.  The .** righ
19670 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
19680 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  ) is an array of
19690 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63   zero or more sc
196a0 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20  alar values, or 
196b0 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20  a.** subquery.  
196c0 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
196d0 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75  subquery, the nu
196e0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
196f0 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d  olumns must.** m
19700 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
19710 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
19720 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
19730 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53  LHS.  If the RHS
19740 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66   is.** a list of
19750 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53   values, the LHS
19760 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61   must be a scala
19770 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e  r. .**.** The IN
19780 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75   operator is tru
19790 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c  e if the LHS val
197a0 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ue is contained 
197b0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a  within the RHS..
197c0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
197d0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48   false if the LH
197e0 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20  S is definitely 
197f0 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20  not in the RHS. 
19800 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20   The .** result 
19810 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  is NULL if the p
19820 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c  resence of the L
19830 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61  HS in the RHS ca
19840 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65  nnot be .** dete
19850 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55  rmined due to NU
19860 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LLs..**.** This 
19870 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
19880 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
19890 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
198a0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
198b0 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
198c0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
198d0 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
198e0 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
198f0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
19900 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
19910 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
19920 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
19930 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
19940 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
19950 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
19960 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
19970 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  h..**.** See the
19980 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65   separate in-ope
19990 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e  rator.md documen
199a0 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74  tation file in t
199b0 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
199c0 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72  SQLite source tr
199d0 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ee for additiona
199e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
199f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
19a00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
19a10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19a20 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
19a30 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
19a40 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
19a50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
19a60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
19a70 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
19a80 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
19a90 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
19aa0 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
19ab0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
19ac0 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
19ad0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
19ae0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19af0 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
19b00 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
19b10 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
19b20 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
19b30 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
19b40 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
19b50 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
19b60 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
19b70 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
19b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
19b90 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
19ba0 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20   int rLhs;      
19bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
19bc0 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68  er(s) holding th
19bd0 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a  e LHS values */.
19be0 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20    int rLhsOrig; 
19bf0 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76          /* LHS v
19c00 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72  alues prior to r
19c10 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d  eordering by aiM
19c20 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ap[] */.  Vdbe *
19c30 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
19c40 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
19c50 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
19c60 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
19c70 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
19c80 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69  p from vector fi
19c90 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c  eld to index col
19ca0 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
19cb0 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Aff = 0;       /
19cc0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
19cd0 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  g for comparison
19ce0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74  s */.  int nVect
19cf0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
19d00 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20  Size of vectors 
19d10 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
19d20 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ator */.  int iD
19d30 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20  ummy;           
19d40 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74  /* Dummy paramet
19d50 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65  er to exprCodeVe
19d60 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72  ctor() */.  Expr
19d70 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
19d80 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
19d90 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
19da0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
19dc0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
19dd0 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20  int destStep2;  
19de0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
19df0 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c  o jump when NULL
19e00 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32  s seen in step 2
19e10 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
19e20 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ep6 = 0;    /* S
19e30 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72  tart of code for
19e40 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   Step 6 */.  int
19e50 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20   addrTruthOp;   
19e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19e70 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74   opcode that det
19e80 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69  ermines the IN i
19e90 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
19ea0 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  destNotNull;    
19eb0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19ec0 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  f a comparison i
19ed0 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74  s not true in st
19ee0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
19ef0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
19f00 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74  /* Top of the st
19f10 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20  ep-6 loop */ .  
19f20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20 20  int iTab = 0;   
19f30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
19f40 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66  o use */..  pLef
19f50 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
19f60 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
19f70 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
19f80 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
19f90 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
19fa0 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
19fb0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
19fc0 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
19fd0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
19fe0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
19ff0 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
1a000 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1a010 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
1a020 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
1a030 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
1a040 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
1a050 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a060 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a070 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
1a080 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
1a090 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
1a0a0 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
1a0b0 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
1a0c0 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
1a0d0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
1a0e0 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
1a0f0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
1a100 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
1a110 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62  with cursor iTab
1a120 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  .  ** contains t
1a130 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
1a140 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20  ake up the RHS. 
1a150 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  If IN_INDEX_NOOP
1a160 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
1a170 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e  ** the RHS has n
1a180 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
1a190 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  d.  */.  v = pPa
1a1a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1a1b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
1a1c0 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
1a1d0 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
1a1e0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
1a1f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a200 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
1a210 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
1a220 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a230 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
1a240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
1a260 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
1a270 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  IP | IN_INDEX_NO
1a280 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20  OP_OK,.         
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d      destIfFalse=
1a2b0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20  =destIfNull ? 0 
1a2c0 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a  : &rRhsHasNull,.
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69 4d               aiM
1a2f0 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20 61  ap, &iTab);..  a
1a300 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1a310 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
1a320 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
1a330 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
1a340 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
1a350 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
1a360 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a370 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
1a380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a390 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
1a3a0 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
1a3b0 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
1a3c0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
1a3d0 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
1a3e0 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
1a3f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1a400 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1a410 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
1a420 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
1a430 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
1a440 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
1a450 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
1a460 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
1a470 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
1a480 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
1a490 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
1a4a0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
1a4b0 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
1a4c0 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
1a4d0 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
1a4e0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
1a4f0 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
1a500 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
1a510 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
1a520 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1a530 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
1a540 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
1a550 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
1a560 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
1a570 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
1a580 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
1a590 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
1a5a0 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
1a5b0 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
1a5c0 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
1a5d0 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
1a5e0 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
1a5f0 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
1a600 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
1a610 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
1a620 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
1a630 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
1a640 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
1a650 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
1a660 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
1a670 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
1a680 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
1a690 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
1a6a0 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
1a6b0 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
1a6c0 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
1a6d0 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
1a6e0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
1a6f0 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
1a700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a710 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
1a720 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
1a730 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
1a740 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
1a750 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1a760 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
1a770 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
1a780 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1a790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1a7a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a7b0 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
1a7c0 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
1a7d0 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
1a7e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
1a7f0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
1a800 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
1a810 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1a820 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
1a830 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
1a840 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
1a850 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
1a860 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
1a870 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
1a880 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
1a890 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
1a8a0 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
1a8b0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
1a8c0 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
1a8d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a8e0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
1a8f0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1a900 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
1a910 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
1a920 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
1a930 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1a940 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
1a950 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
1a960 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
1a970 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a980 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
1a990 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
1a9a0 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
1a9b0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
1a9c0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
1a9d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a9e0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1a9f0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1aa00 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1aa10 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1aa20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
1aa30 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1aa40 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1aa50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1aa60 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
1aa70 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
1aa80 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
1aa90 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
1aaa0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
1aab0 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
1aac0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1aad0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
1aae0 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
1aaf0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
1ab00 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
1ab10 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1ab20 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
1ab30 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1ab40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ab50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
1ab60 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
1ab70 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
1ab80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ab90 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
1aba0 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
1abb0 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
1abc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1abd0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1abe0 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
1abf0 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1ac20 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1ac30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ac40 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
1ac50 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1ac60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ac70 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
1ac80 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
1ac90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1aca0 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1acb0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
1acc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1acd0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
1ace0 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
1acf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ad00 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1ad10 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
1ad20 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1ad50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
1ad60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ad70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad80 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1ad90 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
1ada0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1adb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
1adc0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1add0 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
1ade0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1adf0 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
1ae00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ae10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1ae20 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
1ae30 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
1ae40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1ae50 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ae60 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
1ae70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ae80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1ae90 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
1aea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1aeb0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1aec0 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
1aed0 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
1aee0 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1aef0 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
1af00 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
1af10 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
1af20 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
1af30 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
1af40 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
1af50 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
1af60 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1af70 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
1af80 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
1af90 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
1afa0 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
1afb0 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
1afc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1afd0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1afe0 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
1aff0 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
1b000 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
1b010 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
1b020 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
1b030 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1b040 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  arse);.  }.  for
1b050 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1b060 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1b070 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
1b080 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1b090 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  Expr->pLeft, i);
1b0a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b0b0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
1b0c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b0d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b0e0 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69  P_IsNull, rLhs+i
1b0f0 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20  , destStep2);.  
1b100 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b110 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (v);.    }.  }..
1b120 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68    /* Step 3.  Th
1b130 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f  e LHS is now kno
1b140 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
1b150 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72  L.  Do the binar
1b160 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66  y search.  ** of
1b170 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74   the RHS using t
1b180 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62  he LHS as a prob
1b190 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68  e.  If found, th
1b1a0 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a  e result is.  **
1b1b0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   true..  */.  if
1b1c0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
1b1d0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f  X_ROWID ){.    /
1b1e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
1b1f0 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
1b200 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
1b210 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61  tree and so we a
1b220 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20  lso.    ** know 
1b230 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20  that the RHS is 
1b240 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65  non-NULL.  Hence
1b250 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65  , we combine ste
1b260 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a  ps 3 and 4.    *
1b270 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
1b280 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73  opcode. */.    s
1b290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b2a0 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
1b2b0 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61  , iTab, destIfFa
1b2c0 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
1b2d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b2e0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1b2f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b300 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
1b310 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
1b320 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
1b330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b340 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1b350 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
1b360 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
1b370 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
1b380 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b390 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
1b3a0 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
1b3b0 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
1b3c0 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1b3d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b3e0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1b3f0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1b400 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Tab, destIfFalse
1b410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
1b430 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
1b440 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b450 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
1b460 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1b470 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
1b480 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20  * Ordinary Step 
1b490 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  3, for the case 
1b4a0 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20  where FALSE and 
1b4b0 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63  NULL are distinc
1b4c0 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75  t */.    addrTru
1b4d0 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
1b4e0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1b4f0 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30  P_Found, iTab, 0
1b500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1b530 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1b540 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1b550 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74  /* Step 4.  If t
1b560 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20  he RHS is known 
1b570 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  to be non-NULL a
1b580 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69  nd we did not fi
1b590 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68  nd.  ** an match
1b5a0 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61   on the search a
1b5b0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
1b5c0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41  esult must be FA
1b5d0 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LSE..  */.  if( 
1b5e0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e  rRhsHasNull && n
1b5f0 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20  Vector==1 ){.   
1b600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b610 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1b620 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
1b630 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1b640 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b650 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1b660 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f   5.  If we do no
1b670 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1b680 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1b690 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a  een NULL and.  *
1b6a0 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75  * FALSE, then ju
1b6b0 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  st return false.
1b6c0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73   .  */.  if( des
1b6d0 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1b6e0 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64  Null ) sqlite3Vd
1b6f0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
1b700 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74  False);..  /* St
1b710 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75  ep 6: Loop throu
1b720 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52  gh rows of the R
1b730 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63  HS.  Compare eac
1b740 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53  h row to the LHS
1b750 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f  ..  ** If any co
1b760 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c  mparison is NULL
1b770 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1b780 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61  t is NULL.  If a
1b790 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  ll.  ** comparis
1b7a0 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68  ons are FALSE th
1b7b0 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  en the final res
1b7c0 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20  ult is FALSE..  
1b7d0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63  **.  ** For a sc
1b7e0 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20  alar LHS, it is 
1b7f0 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68  sufficient to ch
1b800 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72  eck just the fir
1b810 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74  st row.  ** of t
1b820 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69  he RHS..  */.  i
1b830 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73  f( destStep6 ) s
1b840 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b850 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74  eLabel(v, destSt
1b860 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20  ep6);.  addrTop 
1b870 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b880 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
1b890 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61  , iTab, destIfFa
1b8a0 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  lse);.  VdbeCove
1b8b0 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e  rage(v);.  if( n
1b8c0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1b8d0 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  destNotNull = sq
1b8e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b8f0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65  el(pParse);.  }e
1b900 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
1b910 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62  nVector==1, comb
1b920 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20  ine steps 6 and 
1b930 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79  7 by immediately
1b940 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a   returning.    *
1b950 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66  * FALSE if the f
1b960 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  irst comparison 
1b970 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  is not NULL */. 
1b980 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
1b990 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1b9a0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1b9b0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1b9c0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43    Expr *p;.    C
1b9d0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1b9e0 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69     int r3 = sqli
1b9f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1ba00 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73  arse);.    p = s
1ba10 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
1ba20 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
1ba30 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  i);.    pColl = 
1ba40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1ba50 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
1ba60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ba70 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1ba80 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b  n, iTab, i, r3);
1ba90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1baa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1bab0 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74   rLhs+i, destNot
1bac0 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20  Null, r3,.      
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1baf0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56  _COLLSEQ);.    V
1bb00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bb10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1bb20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1bb30 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , r3);.  }.  sql
1bb40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bb50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1bb60 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28  stIfNull);.  if(
1bb70 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1bb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1bb90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1bba0 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  tNotNull);.    s
1bbb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bbc0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
1bbd0 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  b, addrTop+1);. 
1bbe0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bbf0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
1bc00 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
1bc10 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
1bc20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
1bc30 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
1bc40 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
1bc50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bc60 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1bc70 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
1bc80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
1bc90 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
1bca0 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
1bcb0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1bcc0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
1bcd0 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
1bce0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1bcf0 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
1bd00 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
1bd10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1bd20 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
1bd30 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1bd40 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
1bd50 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72  "));.sqlite3Expr
1bd60 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
1bd70 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
1bd80 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
1bd90 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Map);.  sqlite3D
1bda0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1bdb0 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69  , zAff);.}.#endi
1bdc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1bdd0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
1bde0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bdf0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1be00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1be10 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1be20 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1be30 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1be40 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
1be50 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
1be60 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1be70 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
1be80 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
1be90 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
1bea0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
1beb0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
1bec0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
1bed0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
1bee0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
1bef0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
1bf00 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
1bf10 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
1bf20 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1bf30 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
1bf40 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
1bf50 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
1bf60 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1bf70 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
1bf80 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1bf90 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1bfa0 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
1bfb0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
1bfc0 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
1bfd0 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
1bfe0 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
1bff0 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
1c000 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
1c010 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
1c020 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
1c030 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
1c040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c050 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1c060 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
1c070 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1c080 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
1c090 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1c0a0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1c0b0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1c0c0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
1c0d0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
1c0e0 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
1c0f0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1c100 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
1c110 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
1c120 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
1c130 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
1c140 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
1c150 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
1c160 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1c170 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
1c180 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
1c190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c1a0 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
1c1b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
1c1c0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
1c1d0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
1c1e0 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
1c1f0 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
1c200 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
1c210 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
1c220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c230 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
1c240 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
1c250 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
1c260 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
1c270 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
1c280 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1c290 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
1c2a0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
1c2b0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
1c2c0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
1c2d0 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c   (c==3 && !negFl
1c2e0 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c  ag) || (c==2) ||
1c2f0 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c   (negFlag && val
1c300 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ue==SMALLEST_INT
1c310 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  64)){.#ifdef SQL
1c320 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1c330 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
1c340 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c350 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
1c360 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
1c370 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
1c380 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
1c390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c3a0 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
1c3b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c3c0 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
1c3d0 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
1c3e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c3f0 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
1c400 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
1c410 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22  %s%s", negFlag?"
1c420 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20  -":"",z);.      
1c430 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1c440 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64     {.        cod
1c450 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
1c460 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
1c470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1c480 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1c490 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
1c4a0 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45   = c==3 ? SMALLE
1c4b0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
1c4c0 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
1c4d0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1c4e0 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
1c4f0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
1c500 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
1c510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1c520 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c530 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
1c540 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
1c550 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
1c560 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
1c570 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
1c580 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1c590 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
1c5a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c5b0 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
1c5c0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1c5d0 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
1c5e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c5f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
1c600 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1c610 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
1c620 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1c630 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1c640 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1c650 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1c660 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
1c670 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
1c680 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1c690 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
1c6a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1c6b0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
1c6c0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
1c6d0 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
1c6e0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1c6f0 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
1c700 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
1c710 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
1c720 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
1c730 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1c740 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
1c750 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1c760 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
1c770 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
1c780 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c790 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20  = iTabCur + 1;. 
1c7a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1c7b0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
1c7c0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
1c7d0 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c  [iIdxCol].pExpr,
1c7e0 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50   regOut);.    pP
1c7f0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1c800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c810 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c820 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1c830 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1c840 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54  pIdx->pTable, iT
1c850 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
1c880 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1c890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c8a0 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
1c8b0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
1c8c0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
1c8d0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
1c8e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c8f0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c900 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
1c910 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
1c920 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
1c930 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
1c940 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
1c950 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
1c960 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
1c970 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
1c980 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1c990 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
1c9a0 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
1c9b0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
1c9c0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1c9d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1c9e0 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
1c9f0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
1ca00 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
1ca10 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
1ca20 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
1ca30 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54  r */.){.  if( pT
1ca40 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
1ca50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ca60 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
1ca70 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  bCur, iCol, regO
1ca80 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ut);.    return;
1ca90 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c  .  }.  if( iCol<
1caa0 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
1cab0 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
1cac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cad0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1cae0 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
1caf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1cb00 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
1cb10 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
1cb20 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
1cb30 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
1cb40 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1cb50 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73 56  id(pTab) && !IsV
1cb60 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1cb70 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
1cb80 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
1cb90 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1cba0 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
1cbb0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1cbc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cbd0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
1cbe0 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
1cbf0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
1cc00 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
1cc10 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
1cc20 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
1cc30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1cc40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1cc50 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
1cc60 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
1cc70 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
1cc80 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
1cc90 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1cca0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
1ccb0 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  Reg. .**.** Ther
1ccc0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
1ccd0 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
1cce0 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
1ccf0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1cd00 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
1cd10 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
1cd20 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
1cd30 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
1cd40 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
1cd50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1cd60 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
1cd70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1cd80 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1cd90 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1cda0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1cdb0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1cdc0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1cdd0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1cde0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1cdf0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1ce00 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1ce10 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1ce20 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1ce30 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1ce40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1ce50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1ce60 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
1ce70 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1ce80 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
1ce90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
1cea0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
1ceb0 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
1cec0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1ced0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1cee0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1cef0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1cf00 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1cf10 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1cf20 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1cf30 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1cf40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cf50 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1cf60 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1cf70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1cf80 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
1cf90 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
1cfa0 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
1cfb0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
1cfc0 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
1cfd0 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Reg-1..*/.void s
1cfe0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1cff0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1d000 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1d010 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1d020 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1d030 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1d040 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1d050 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d060 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1d070 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1d080 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1d090 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1d0a0 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d0b0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
1d0c0 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72  K_REGISTER refer
1d0d0 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74  encing.** regist
1d0e0 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61  er iReg.  The ca
1d0f0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
1d100 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61   that iReg alrea
1d110 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  dy contains.** t
1d120 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1d130 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
1d140 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d150 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
1d160 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
1d170 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
1d180 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
1d190 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1d1a0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
1d1b0 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
1d1c0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
1d1d0 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76  ip);.}../*.** Ev
1d1e0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1d1f0 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76  sion (either a v
1d200 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
1d210 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e  r expression) an
1d220 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  d store.** the r
1d230 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67  esult in conting
1d240 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72  uous temporary r
1d250 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75 72  egisters.  Retur
1d260 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1d270 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
1d280 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f  ster used to sto
1d290 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  re the result..*
1d2a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
1d2b0 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1d2c0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1d2d0 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e  ary scalar, then
1d2e0 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74   also write.** t
1d2f0 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
1d300 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65  ber into *piFree
1d310 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65  able.  If the re
1d320 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1d330 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74  gister.** is not
1d340 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
1d350 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1d360 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73 65  n is a vector se
1d370 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a  t *piFreeable.**
1d380 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
1d390 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63   int exprCodeVec
1d3a0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1d3b0 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  e, Expr *p, int 
1d3c0 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20  *piFreeable){.  
1d3d0 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69  int iResult;.  i
1d3e0 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  nt nResult = sql
1d3f0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
1d400 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65  ze(p);.  if( nRe
1d410 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69  sult==1 ){.    i
1d420 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d430 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d440 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62  rse, p, piFreeab
1d450 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1d460 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20    *piFreeable = 
1d470 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  0;.    if( p->op
1d480 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23  ==TK_SELECT ){.#
1d490 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  if SQLITE_OMIT_S
1d4a0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69 52  UBQUERY.      iR
1d4b0 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65  esult = 0;.#else
1d4c0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d4d0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1d4e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 29  elect(pParse, p)
1d4f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1d500 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1d510 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d520 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1d530 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1d540 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1d550 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d560 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1d570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d580 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
1d590 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70  e(pParse, p->x.p
1d5a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1d5b0 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20  , i+iResult);.  
1d5c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d5d0 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74    return iResult
1d5e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
1d5f0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
1d600 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
1d610 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1d620 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1d630 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
1d640 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d650 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
1d660 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
1d670 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1d680 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
1d690 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1d6a0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
1d6b0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
1d6c0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
1d6d0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
1d6e0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
1d6f0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
1d700 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
1d710 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
1d720 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
1d730 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
1d740 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
1d750 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1d760 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
1d770 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
1d780 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
1d790 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
1d7a0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
1d7b0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1d7c0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
1d7d0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1d7e0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1d7f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d800 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
1d810 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
1d820 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1d830 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1d840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d850 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1d860 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
1d870 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
1d880 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
1d890 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1d8a0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
1d8b0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
1d8c0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
1d8d0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
1d8e0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d8f0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
1d900 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
1d910 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1d920 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1d930 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1d940 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
1d950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d960 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
1d970 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70  numbers */.  Exp
1d980 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1d990 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1d9a0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1d9b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1d9c0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1d9d0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1d9e0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1d9f0 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1da00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1da10 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1da20 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1da30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70  turn 0;.  }..exp
1da40 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20  r_code_doover:. 
1da50 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1da60 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1da70 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1da80 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1da90 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1daa0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1dab0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1dac0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1dad0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1dae0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1daf0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1db00 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1db10 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1db20 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1db30 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1db40 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1db50 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1db60 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1db70 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e     return pCol->
1db80 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iMem;.      }els
1db90 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1dba0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1dbb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dbc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1dbd0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1dbe0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1dbf0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1dc20 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1dc30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1dc40 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1dc50 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1dc60 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1dc70 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1dc80 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1dc90 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1dca0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1dcb0 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1dcc0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  e;.      if( Exp
1dcd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1dce0 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
1dcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1dd00 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65  his COLUMN expre
1dd10 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ssion is really 
1dd20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74  a constant due t
1dd30 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
1dd40 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1dd50 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20  aints, and that 
1dd60 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65  constant is code
1dd70 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e  d by the pExpr->
1dd80 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a  pLeft.        **
1dd90 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48   expresssion.  H
1dda0 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72  owever, make sur
1ddb0 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68  e the constant h
1ddc0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  as the correct. 
1ddd0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79         ** dataty
1dde0 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74  pe by applying t
1ddf0 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  he Affinity of t
1de00 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1de10 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
1de20 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20  * constant..    
1de30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1de40 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65  nt iReg = sqlite
1de50 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1de60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1de70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20  Left,target);.  
1de80 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20        int aff = 
1de90 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
1dea0 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  mnAffinity(pExpr
1deb0 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78 70 72 2d  ->y.pTab, pExpr-
1dec0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1ded0 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49     if( aff!=SQLI
1dee0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20  TE_AFF_BLOB ){. 
1def0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1df00 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b  const char zAff[
1df10 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44  ] = "B\000C\000D
1df20 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20  \000E";.        
1df30 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1df40 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29  _AFF_BLOB=='A' )
1df50 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1df60 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  rt( SQLITE_AFF_T
1df70 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20  EXT=='B' );.    
1df80 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
1df90 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1dfa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dfb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1dfc0 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
1dfd0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1dfe0 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  iReg = target;. 
1dff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e010 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
1e020 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20  inity, iReg, 1, 
1e030 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1e050 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32  zAff[(aff-'B')*2
1e060 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
1e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e080 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20   return iReg;.  
1e090 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e0a0 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
1e0b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53    if( pParse->iS
1e0c0 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  elfTab<0 ){.    
1e0d0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1e0e0 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
1e0f0 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
1e100 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
1e110 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1e120 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1e130 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73  >iColumn - pPars
1e140 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
1e150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e160 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
1e170 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1e180 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1e190 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
1e1a0 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
1e1b0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1e1c0 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
1e1d0 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
1e1e0 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
1e1f0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
1e200 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
1e210 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20  elfTab - 1;.    
1e220 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e230 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e240 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1e250 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
1e260 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20 20  r->y.pTab,.     
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e290 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
1e2a0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1e2d0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  2);.    }.    ca
1e2e0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1e2f0 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
1e300 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
1e310 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e320 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e330 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1e340 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20  e TK_TRUEFALSE: 
1e350 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e360 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e370 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33  Integer, sqlite3
1e380 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1e390 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a  Expr), target);.
1e3a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e3b0 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1e3c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1e3d0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1e3e0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1e3f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e400 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e410 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e420 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
1e430 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
1e440 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
1e450 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e460 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e480 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1e490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e4a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e4b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e4c0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
1e4d0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1e4e0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78  g(v, target, pEx
1e4f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1e500 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e510 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e520 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1e530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1e550 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e560 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e570 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1e580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1e590 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1e5a0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
1e5b0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
1e5c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1e5d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
1e5e0 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
1e5f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e600 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e610 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1e620 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e630 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
1e640 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
1e650 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
1e660 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e670 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
1e680 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
1e690 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
1e6a0 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
1e6b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e6c0 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
1e6d0 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
1e6e0 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   );.      zBlob 
1e6f0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
1e700 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
1e710 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
1e720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e730 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
1e740 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
1e750 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
1e760 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  C);.      return
1e770 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e780 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1e790 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1e7a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e7b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e7c0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e7d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e7e0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e7f0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
1e800 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e810 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
1e820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e830 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
1e840 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
1e850 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1e860 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1e870 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
1e880 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1e890 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1e8a0 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
1e8b0 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
1e8c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1e8d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e8e0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1e8f0 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72  n[0]=='?' || str
1e900 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
1e910 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20  ken, z)==0 );.  
1e920 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
1e930 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  List[0] = 0; /* 
1e940 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d  Indicate VList m
1e950 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ay no longer be 
1e960 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20  enlarged */.    
1e970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e980 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72  ppendP4(v, (char
1e990 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  *)z, P4_STATIC);
1e9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e9b0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e9c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e9d0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
1e9e0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1e9f0 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69  iTable;.    }.#i
1ea00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ea10 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1ea20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1ea30 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1ea40 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1ea50 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1ea60 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
1ea70 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1ea80 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1ea90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1eaa0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1eab0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1eac0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1ead0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eae0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1eaf0 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1eb00 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1eb10 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1eb20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1eb30 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
1eb40 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1eb70 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1eb80 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
1eb90 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20  return inReg;.  
1eba0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ebb0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
1ebc0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  /.    case TK_IS
1ebd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1ebe0 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20  NOT:.      op = 
1ebf0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1ec00 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1ec10 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e     p5 = SQLITE_N
1ec20 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
1ec30 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a  fall-through */.
1ec40 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1ec50 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1ec60 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1ec70 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1ec80 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1ec90 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1eca0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1ecb0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1ecc0 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ft;.      if( sq
1ecd0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
1ece0 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  r(pLeft) ){.    
1ecf0 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f      codeVectorCo
1ed00 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1ed10 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c  xpr, target, op,
1ed20 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   p5);.      }els
1ed30 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1ed40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ed50 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1ed60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1ed70 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1ed80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ed90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1eda0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1edb0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43  );.        codeC
1edc0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1edd0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1ede0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1edf0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
1ee00 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
1ee10 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20  P2 | p5);.      
1ee20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
1ee30 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
1ee40 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
1ee50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ee60 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1ee70 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
1ee80 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
1ee90 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
1eea0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1eeb0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1eec0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1eed0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1eee0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1eef0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ef00 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1ef10 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1ef20 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1ef30 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1ef40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ef50 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1ef60 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
1ef70 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
1ef80 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
1ef90 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1efa0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
1efb0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1efc0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1efd0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1efe0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1eff0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1f000 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f010 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f020 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f030 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1f040 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1f050 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f060 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
1f070 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
1f080 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
1f090 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
1f0a0 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
1f0b0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
1f0c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
1f0d0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1f0e0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
1f0f0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
1f100 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
1f110 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
1f120 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
1f130 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
1f140 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
1f150 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20  P_And );        
1f160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f170 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
1f180 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
1f190 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20  =OP_Or );       
1f1a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f1b0 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
1f1c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
1f1d0 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20  LUS==OP_Add );  
1f1e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1f1f0 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29  e( op==TK_PLUS )
1f200 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f210 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
1f220 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73  tract );     tes
1f230 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
1f240 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NUS );.      ass
1f250 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
1f260 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20  Remainder );    
1f270 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f280 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
1f290 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
1f2a0 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20  D==OP_BitAnd ); 
1f2b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f2c0 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
1f2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f2e0 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
1f2f0 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63   );        testc
1f300 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
1f310 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f320 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
1f330 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20  Divide );       
1f340 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f350 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
1f360 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
1f370 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
1f380 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1f390 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
1f3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f3b0 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
1f3c0 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63  tRight );  testc
1f3d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
1f3e0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1f3f0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
1f400 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20  P_Concat );     
1f410 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f420 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
1f430 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f440 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f450 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f460 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f470 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1f480 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f490 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f4a0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1f4b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f4c0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
1f4d0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1f4e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f4f0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f510 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f530 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1f540 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
1f550 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1f560 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
1f570 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1f580 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
1f590 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1f5a0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
1f5b0 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
1f5c0 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
1f5d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f5e0 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  target;.#ifndef 
1f5f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1f600 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1f610 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
1f620 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1f630 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f640 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f650 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1f660 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1f670 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
1f680 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
1f690 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f6a0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f6b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1f6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1f6d0 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
1f6e0 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
1f6f0 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
1f700 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
1f710 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
1f720 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
1f730 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1f740 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f750 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
1f760 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f770 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1f780 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f790 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f7a0 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
1f7b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f7c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1f7d0 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
1f7e0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
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 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f810 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f830 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
1f840 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1f850 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f860 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
1f870 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1f880 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
1f890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f8a0 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
1f8b0 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;         testca
1f8c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
1f8d0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f8e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f8f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f900 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f910 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f920 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1f950 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
1f960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f970 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
1f980 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  H: {.      int i
1f990 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20  sTrue;    /* IS 
1f9a0 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
1f9b0 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  RUE */.      int
1f9c0 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49   bNormal;   /* I
1f9d0 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c  S TRUE or IS FAL
1f9e0 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d  SE */.      r1 =
1f9f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fa00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fa10 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fa20 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1fa30 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fa40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72  =0 );.      isTr
1fa50 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
1fa60 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
1fa70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
1fa80 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72   bNormal = pExpr
1fa90 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20  ->op2==TK_IS;.  
1faa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
1fab0 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29  True && bNormal)
1fac0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fad0 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e 6f  ( !isTrue && bNo
1fae0 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  rmal);.      sql
1faf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1fb00 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20  t(v, OP_IsTrue, 
1fb10 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72  r1, inReg, !isTr
1fb20 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e 6f  ue, isTrue ^ bNo
1fb30 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  rmal);.      bre
1fb40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fb50 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1fb60 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1fb70 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
1fb80 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
1fb90 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
1fba0 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
1fbb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1fbc0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
1fbd0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1fbe0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
1fbf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fc00 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1fc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fc20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1fc30 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
1fc40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fc50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fc60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fc70 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1fc80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1fca0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
1fcb0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1fcc0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
1fcd0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fce0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
1fcf0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fd00 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fd10 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1fd20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fd30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1fd40 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1fd50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1fd60 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1fd70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fd80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fd90 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1fda0 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1fdb0 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
1fdc0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
1fdd0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
1fde0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1fdf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fe00 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1fe10 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
1fe20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fe30 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
1fe40 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
1fe50 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
1fe60 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1fe70 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1fe80 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  n pInfo->aFunc[p
1fe90 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
1fea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1feb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fec0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1fed0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
1fee0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
1fef0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
1ff00 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1ff10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
1ff20 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
1ff30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
1ff40 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1ff50 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
1ff60 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
1ff70 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1ff80 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
1ff90 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  t */.      const
1ffa0 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
1ffb0 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1ffc0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1ffd0 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
1ffe0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
1fff0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
20000 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
20010 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
20020 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20030 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20040 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
20050 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20060 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
20070 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
20080 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75  ction */.      u
20090 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
200a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
200b0 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
200c0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
200d0 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
200e0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
200f0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
20100 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66  sequence */..#if
20110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20120 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
20130 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
20140 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20150 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
20160 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
20170 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73  ->y.pWin->regRes
20180 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ult;.      }.#en
20190 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 43  dif..      if( C
201a0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
201b0 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33 45  rse) && sqlite3E
201c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
201d0 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
201e0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75         /* SQL fu
201f0 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65  nctions can be e
20200 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79  xpensive. So try
20210 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e   to move constan
20220 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  t functions.    
20230 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68      ** out of th
20240 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76  e inner loop, ev
20250 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
20260 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70   an extra OP_Cop
20270 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  y. */.        re
20280 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20290 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
202a0 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20  e, pExpr, -1);. 
202b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
202c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
202d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
202e0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
202f0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
20300 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20310 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
20320 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
20330 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
20340 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
20350 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
20360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
20370 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
20380 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
20390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
203a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
203b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
203c0 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
203d0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
203e0 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
203f0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
20400 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
20410 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66  rg, enc, 0);.#if
20420 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20430 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
20440 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  NCTION.      if(
20450 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72   pDef==0 && pPar
20460 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
20470 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20480 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
20490 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c  n(db, "unknown",
204a0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
204b0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
204c0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
204d0 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61  0 || pDef->xFina
204e0 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
204f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20500 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
20510 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  own function: %s
20520 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  ()", zId);.     
20530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20540 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
20550 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
20560 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
20570 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
20580 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
20590 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
205a0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
205b0 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
205c0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
205d0 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
205e0 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
205f0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
20600 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
20610 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20620 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20630 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
20640 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
20650 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
20660 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20670 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
20680 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
20690 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
206a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
206b0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
206c0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
206d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
206e0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
206f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20710 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
20720 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
20730 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
20740 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20760 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20770 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20780 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
207a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
207b0 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
207c0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
207d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
207e0 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
207f0 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
20800 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
20810 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
20820 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
20830 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
20840 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
20850 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20860 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20870 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
20880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20890 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
208a0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
208b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
208c0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
208d0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
208e0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23  get);.      }..#
208f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20900 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  UG.      /* The 
20910 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74  AFFINITY() funct
20920 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
20930 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
20940 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a  escribes.      *
20950 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  * the type affin
20960 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ity of the argum
20970 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73  ent.  This is us
20980 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ed for testing o
20990 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53  f.      ** the S
209a0 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63  QLite type logic
209b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
209c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
209d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
209e0 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20  NC_AFFINITY ){. 
209f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
20a00 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22  r *azAff[] = { "
20a10 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22  blob", "text", "
20a20 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67  numeric", "integ
20a30 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20  er", "real" };. 
20a40 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b         char aff;
20a50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20a60 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
20a70 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
20a80 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
20a90 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20aa0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20ab0 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
20ac0 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20  (v, target, .   
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f             aff ?
20af0 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54   azAff[aff-SQLIT
20b00 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e  E_AFF_BLOB] : "n
20b10 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  one");.        r
20b20 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
20b30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20b40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20b50 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
20b60 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
20b70 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
20b80 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
20b90 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
20ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20bb0 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
20bc0 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
20bd0 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
20be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20bf0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
20c00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20c10 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
20c20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
20c30 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
20c40 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20c50 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
20c60 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
20c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20c80 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
20c90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
20ca0 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
20cb0 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
20cc0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
20cd0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
20ce0 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
20cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20d00 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20d10 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
20d20 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
20d30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20d40 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
20d50 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
20d60 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
20d70 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
20d80 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
20d90 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
20da0 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
20db0 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
20dc0 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
20dd0 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
20de0 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
20df0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
20e00 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
20e10 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
20e20 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
20e30 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
20e40 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20e50 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
20e60 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
20e70 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
20e80 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
20e90 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
20ea0 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
20eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
20ec0 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
20ed0 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
20ee0 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
20ef0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20f00 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
20f10 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
20f20 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
20f30 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
20f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
20f50 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
20f60 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
20f70 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
20f80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
20f90 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
20fa0 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
20fb0 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
20fc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20fd0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20fe0 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
20ff0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
21000 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
21010 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21030 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21040 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
21050 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
21060 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
21070 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
21080 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21090 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
210a0 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
210b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
210e0 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
210f0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65  ACTOR);.      }e
21100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
21110 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
21120 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21130 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
21140 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
21150 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
21160 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
21170 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
21180 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
21190 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
211a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
211b0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
211c0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
211d0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
211e0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
211f0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
21200 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
21210 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
21220 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
21230 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
21240 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
21250 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
21260 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
21270 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
21280 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
21290 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
212a0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
212b0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
212c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
212d0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
212e0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
212f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
21300 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
21310 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
21320 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
21330 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
21340 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
21350 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
21360 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
21370 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
21380 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
21390 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
213a0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
213b0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
213c0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
213d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
213e0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78  ( nFarg>=2 && Ex
213f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
21400 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e  xpr, EP_InfixFun
21410 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
21420 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21430 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21440 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21450 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
21460 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
21470 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
21480 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
21490 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
214a0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
214b0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
214c0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
214d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
214e0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
214f0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21500 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
21510 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21520 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
21530 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
21540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21550 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21560 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
21570 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
21580 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
21590 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
215a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
215b0 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20  ET_SQL_FUNC.    
215c0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
215d0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
215e0 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20  UNC_OFFSET ){.  
215f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
21600 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
21610 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
21620 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43  ( pArg->op==TK_C
21630 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
21640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21650 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
21660 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c  t, pArg->iTable,
21670 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pArg->iColumn, 
21680 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
216a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
216b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
216c0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
216d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
216e0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
216f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21700 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50  VdbeAddOp4(v, pP
21710 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f  arse->iSelfTab ?
21720 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20   OP_PureFunc0 : 
21730 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20  OP_Function0,.  
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
21760 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28  k, r1, target, (
21770 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
21780 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
21790 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
217a0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
217b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
217c0 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63    if( nFarg && c
217d0 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  onstMask==0 ){. 
217e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
217f0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
21800 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
21810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21820 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
21830 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21840 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21850 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
21860 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
21870 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
21880 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
21890 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
218a0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
218b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
218c0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
218d0 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
218e0 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20  SELECT && (nCol 
218f0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
21900 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
21910 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  r)!=1 ){.       
21920 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
21930 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e  tError(pParse, n
21940 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Col, 1);.      }
21950 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
21960 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65  turn sqlite3Code
21970 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
21980 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
21990 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
219a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
219b0 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20  _SELECT_COLUMN: 
219c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
219d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
219e0 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30  pLeft->iTable==0
219f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
21a00 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
21a10 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
21a20 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
21a30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
21a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
21a50 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
21a60 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
21a70 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pLeft->op==TK_SE
21a80 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21a90 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a  ( pExpr->iTable.
21aa0 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72 2d         && pExpr-
21ab0 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71  >iTable!=(n = sq
21ac0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
21ad0 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
21ae0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
21af0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21b00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
21b10 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
21b20 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21b50 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
21b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21b70 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
21b80 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
21b90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
21ba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
21bb0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
21bc0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
21bd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21be0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
21bf0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21c00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21c10 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
21c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21c30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21c40 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21c60 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
21c70 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
21c80 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
21c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ca0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21cb0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
21cc0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21cd0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21ce0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
21cf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21d10 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
21d20 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
21d30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21d40 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
21d50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21d60 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
21d70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21d80 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
21d90 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
21da0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
21db0 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
21dc0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
21dd0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
21de0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
21df0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
21e00 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
21e10 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
21e20 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
21e30 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21e40 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
21e50 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
21e60 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21e70 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
21e80 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
21e90 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21ea0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
21eb0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
21ec0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
21ed0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
21ee0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
21ef0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
21f00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
21f10 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
21f20 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
21f30 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
21f40 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
21f50 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
21f60 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
21f70 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
21f80 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
21f90 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
21fa0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
21fb0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
21fc0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
21fd0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
21fe0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
21ff0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
22000 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
22010 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22020 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
22030 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
22040 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
22050 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
22060 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
22070 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
22080 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
22090 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
220a0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
220b0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
220c0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
220d0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
220e0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
220f0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
22100 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
22110 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
22120 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
22130 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
22140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22150 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
22160 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
22170 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
22180 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
22190 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
221a0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
221b0 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
221c0 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
221d0 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
221e0 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
221f0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
22200 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
22210 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
22220 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
22230 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
22240 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
22250 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
22260 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
22270 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
22280 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
22290 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
222a0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
222b0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
222c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
222d0 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
222e0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
222f0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
22300 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22310 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
22320 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
22330 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
22340 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
22350 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
22360 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
22370 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
22380 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
22390 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
223a0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
223b0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
223c0 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
223d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
223e0 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
223f0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
22400 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22410 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
22420 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
22430 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
22440 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
22450 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
22460 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
22470 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
22480 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
22490 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
224a0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
224b0 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
224c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
224d0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
224e0 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
224f0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
22500 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
22510 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
22520 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
22530 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
22540 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22550 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22560 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
22570 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22580 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
22590 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
225a0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
225b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
225c0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
225d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
225e0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
225f0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
22600 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
22610 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22630 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
22640 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
22650 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22660 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73  (v, "r[%d]=%s.%s
22670 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  ", target,.     
22680 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
22690 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
226a0 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
226b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
226c0 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
226d0 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  >y.pTab->aCol[pE
226e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
226f0 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
22700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22710 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
22720 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
22730 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
22740 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
22750 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
22760 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
22770 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
22780 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
22790 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
227a0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
227b0 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
227c0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
227d0 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
227e0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
227f0 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
22800 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
22810 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
22820 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
22830 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
22840 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
22850 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
22860 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
22870 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22880 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
22890 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
228a0 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
228b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
228c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
228d0 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
228e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
228f0 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
22900 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
22910 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
22920 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22930 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
22940 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
22950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22960 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22970 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20  IF_NULL_ROW: {. 
22980 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52       int addrINR
22990 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20  ;.      addrINR 
229a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
229b0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c  Op1(v, OP_IfNull
229c0 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Row, pExpr->iTab
229d0 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  le);.      inReg
229e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
229f0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22a00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
22a10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22a20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
22a30 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20  e(v, addrINR);. 
22a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22a50 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
22a60 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  INR, inReg);.   
22a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22a80 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
22a90 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
22aa0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
22ab0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
22ac0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
22ad0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22ae0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22af0 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
22b00 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
22b10 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22b20 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
22b30 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
22b40 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
22b50 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
22b60 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
22b70 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
22b80 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
22b90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
22ba0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
22bb0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22bc0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
22bd0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
22be0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
22bf0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22c00 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
22c10 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
22c20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
22c30 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
22c40 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
22c50 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
22c60 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
22c70 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
22c80 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
22c90 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
22ca0 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
22cb0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
22cc0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
22cd0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
22ce0 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
22cf0 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
22d00 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
22d10 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
22d20 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22d30 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
22d40 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
22d50 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
22d60 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
22d70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22d80 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
22d90 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
22da0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
22db0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
22dc0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
22dd0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
22de0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
22df0 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
22e00 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
22e10 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
22e20 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
22e30 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
22e40 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
22e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
22e60 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
22e70 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
22e80 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
22e90 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
22ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
22eb0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
22ec0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
22ed0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
22f00 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
22f10 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
22f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22f50 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
22f60 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
22f70 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
22f80 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
22f90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
22fa0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
22fb0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
22fc0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
22fd0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
22fe0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
22ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23000 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
23010 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23020 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23040 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
23050 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
23060 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23080 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
23090 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
230a0 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
230b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
230c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
230d0 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
230e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
230f0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
23100 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
23110 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
23120 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
23130 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
23140 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
23150 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
23160 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
23170 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
23180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
23190 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
231a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
231b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
231c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 70  0 ){.        exp
231d0 72 4e 6f 64 65 43 6f 70 79 28 26 74 65 6d 70 58  rNodeCopy(&tempX
231e0 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 20 20 74  , pX);.        t
231f0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
23200 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
23210 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
23220 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70  ster(&tempX, exp
23230 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
23240 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
23250 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
23260 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23270 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
23280 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
23290 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
232a0 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
232b0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
232c0 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
232d0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
232e0 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
232f0 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
23300 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
23310 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
23320 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
23330 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
23340 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
23350 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
23360 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
23370 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
23380 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
23390 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
233a0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
233b0 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
233c0 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
233d0 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
233e0 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
233f0 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
23400 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
23410 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
23420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
23430 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
23440 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
23450 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
23460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23470 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
23480 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
23490 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
234a0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
234b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
234c0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
234d0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
234e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
234f0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
23500 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23510 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
23520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
23530 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
23540 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
23550 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23560 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
23570 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
23580 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
23590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
235a0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
235b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
235c0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
235d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
235e0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
235f0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
23600 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
23610 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
23620 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
23630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
23640 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
23650 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
23660 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
23670 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
23680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23690 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
236a0 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70  st->a[nExpr-1].p
236b0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
236c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
236d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
236e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
236f0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
23700 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
23710 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
23720 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
23730 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23740 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
23750 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
23760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
23770 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
23780 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
23790 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
237a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
237b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
237c0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
237d0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
237e0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
237f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
23800 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23810 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
23820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
23830 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
23840 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
23850 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23860 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
23870 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
23880 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
23890 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
238a0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
238b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
238c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
238d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
238e0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
238f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23900 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
23910 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
23920 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23930 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23940 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
23950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
23960 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23970 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
23980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23990 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
239a0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
239b0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
239c0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
239d0 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
239e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
239f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
23a10 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
23a20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
23a30 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
23a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23a60 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
23a70 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23a80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
23a90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23aa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
23ab0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23ac0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
23ad0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
23ae0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23af0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
23b00 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
23b10 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
23b20 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
23b30 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
23b40 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
23b50 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
23b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65  ..**.** If regDe
23b70 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72  st>=0 then the r
23b80 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
23b90 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72  stored in that r
23ba0 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a  egister and the.
23bb0 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  ** result is not
23bc0 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72   reusable.  If r
23bd0 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68  egDest<0 then th
23be0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72  is routine is fr
23bf0 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20  ee to .** store 
23c00 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65  the value wheree
23c10 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54  ver it wants.  T
23c20 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
23c30 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
23c40 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
23c50 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65  s returned.  Whe
23c60 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f  n regDest<0, two
23c70 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65   identical expre
23c80 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63  ssions will.** c
23c90 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ode to the same 
23ca0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
23cb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23cc0 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
23cd0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23ce0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23cf0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
23d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
23d10 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
23d20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
23d30 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
23d40 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20  nt regDest      
23d50 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
23d60 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
23d70 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
23d80 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
23d90 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
23da0 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
23db0 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
23dc0 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67  tExpr;.  if( reg
23dd0 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20  Dest<0 && p ){. 
23de0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23df0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
23e00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23e10 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
23e20 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
23e30 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
23e40 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
23e50 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
23e60 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
23e70 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  ,pItem->pExpr,pE
23e80 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
23e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
23ea0 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
23eb0 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Reg;.      }.   
23ec0 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d   }.  }.  pExpr =
23ed0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
23ee0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
23ef0 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c  r, 0);.  p = sql
23f00 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
23f10 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  nd(pParse, p, pE
23f20 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  xpr);.  if( p ){
23f30 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70  .     struct Exp
23f40 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
23f50 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78  m = &p->a[p->nEx
23f60 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65  pr-1];.     pIte
23f70 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
23f80 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66  gDest<0;.     if
23f90 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65  ( regDest<0 ) re
23fa0 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65  gDest = ++pParse
23fb0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74  ->nMem;.     pIt
23fc0 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
23fd0 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
23fe0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f   }.  pParse->pCo
23ff0 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72  nstExpr = p;.  r
24000 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d  eturn regDest;.}
24010 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24020 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
24030 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
24040 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
24050 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
24060 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
24070 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
24080 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
24090 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
240a0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
240b0 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
240c0 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
240d0 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
240e0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
240f0 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
24100 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
24110 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
24120 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
24130 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
24140 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
24150 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
24160 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
24170 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
24180 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
24190 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a  generate this.**
241a0 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68   code to fill th
241b0 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  e register in th
241c0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
241d0 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a   section of the.
241e0 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c  ** VDBE program,
241f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   in order to fac
24200 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68  tor it out of th
24210 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f  e evaluation loo
24220 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
24230 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
24240 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24250 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
24260 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a  Reg){.  int r2;.
24270 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24280 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
24290 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43  (pExpr);.  if( C
242a0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
242b0 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72  rse).   && pExpr
242c0 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
242d0 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  R.   && sqlite3E
242e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
242f0 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b  Join(pExpr).  ){
24300 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b  .    *pReg  = 0;
24310 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
24320 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
24330 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
24340 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
24350 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
24360 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24370 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
24380 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
24390 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
243a0 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
243b0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
243c0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
243d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
243e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
243f0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
24400 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
24410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24420 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
24430 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24440 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
24450 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
24460 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
24470 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24480 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24490 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
244a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
244b0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
244c0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
244d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
244e0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
244f0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24500 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24510 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
24520 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
24530 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
24540 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
24550 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
24560 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
24570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
24580 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
24590 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
245a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
245b0 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
245c0 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
245d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
245e0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
245f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
24600 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24610 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
24620 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
24630 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
24640 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
24650 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
24660 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
24670 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
24680 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
24690 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
246a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
246b0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
246c0 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
246d0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
246e0 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
246f0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
24700 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
24710 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
24720 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
24730 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
24740 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
24750 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
24760 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
24770 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
24780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24790 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
247a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
247b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
247c0 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
247d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
247e0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
247f0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
24800 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
24810 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24820 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
24830 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
24840 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
24850 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
24860 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
24870 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24880 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
24890 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
248a0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
248b0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
248c0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
248d0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
248e0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
248f0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
24900 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24910 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
24920 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
24930 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24940 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
24950 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
24960 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
24970 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
24980 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24990 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
249a0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
249b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
249c0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
249d0 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
249e0 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
249f0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24a00 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29  NotJoin(pExpr) )
24a10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
24a20 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
24a30 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24a40 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
24a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24a60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24a70 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
24a80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24a90 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
24aa0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
24ab0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
24ac0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
24ad0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24ae0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
24af0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
24b00 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
24b10 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
24b20 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
24b30 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
24b40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
24b50 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
24b60 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
24b70 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
24b80 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
24b90 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
24ba0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
24bb0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
24bc0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
24bd0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
24be0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
24bf0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
24c00 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
24c10 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
24c20 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
24c30 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
24c40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
24c50 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
24c60 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24c70 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24c80 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
24c90 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
24ca0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
24cb0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
24cd0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
24ce0 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
24cf0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24d00 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24d10 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
24d20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
24d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24d40 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
24d50 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
24d60 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
24d70 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
24d80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24d90 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
24da0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
24db0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
24dc0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
24dd0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
24de0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
24df0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
24e00 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
24e10 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
24e20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
24e30 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  uated.  The numb
24e40 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  er returned will
24e50 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70  .** usually be p
24e60 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20  List->nExpr but 
24e70 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65 64  might be reduced
24e80 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
24e90 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65  OMITREF.** is de
24ea0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fined..**.** The
24eb0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
24ec0 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
24ed0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
24ee0 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
24ef0 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
24f00 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
24f10 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
24f20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
24f30 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
24f40 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
24f50 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
24f60 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
24f70 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
24f80 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
24f90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
24fa0 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
24fb0 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
24fc0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
24fd0 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
24fe0 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
24ff0 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
25000 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
25010 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
25020 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
25030 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
25040 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
25050 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
25060 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c  there..** If SQL
25070 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25080 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68   is also set, th
25090 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77 69  en the values wi
250a0 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  th u.x.iOrderByC
250b0 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70  ol>0.** are simp
250c0 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65  ly omitted rathe
250d0 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70  r than being cop
250e0 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e  ied from srcReg.
250f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
25100 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
25110 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25120 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
25130 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
25140 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
25150 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
25160 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
25170 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
25180 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
25190 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
251a0 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73  sults */.  int s
251b0 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  rcReg,        /*
251c0 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72   Source register
251d0 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  s if SQLITE_ECEL
251e0 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61  _REF */.  u8 fla
251f0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
25200 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c  SQLITE_ECEL_* fl
25210 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ags */.){.  stru
25220 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
25230 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
25240 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70  , j, n;.  u8 cop
25250 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53  yOp = (flags & S
25260 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20  QLITE_ECEL_DUP) 
25270 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53  ? OP_Copy : OP_S
25280 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  Copy;.  Vdbe *v 
25290 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
252a0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
252b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
252c0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
252d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
252e0 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e  Vdbe!=0 );  /* N
252f0 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66  ever gets this f
25300 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ar otherwise */.
25310 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
25320 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74  pr;.  if( !Const
25330 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
25340 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c   ) flags &= ~SQL
25350 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b  ITE_ECEL_FACTOR;
25360 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
25370 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
25380 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
25390 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
253a0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
253b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
253c0 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
253d0 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 70  RENCES.    if( p
253e0 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
253f0 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20   ){.      i--;. 
25400 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65       n--;.    }e
25410 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
25420 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
25430 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20  TE_ECEL_REF)!=0 
25440 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75  && (j = pItem->u
25450 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
25460 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  0 ){.      if( f
25470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
25480 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20  EL_OMITREF ){.  
25490 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20        i--;.     
254a0 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     n--;.      }e
254b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
254c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
254d0 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52  , copyOp, j+srcR
254e0 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b  eg-1, target+i);
254f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
25500 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
25510 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
25520 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  OR)!=0.         
25530 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
25540 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
25550 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b 0a  n(pExpr).    ){.
25560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25570 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
25580 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25590 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t+i);.    }else{
255a0 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
255b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
255c0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
255d0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
255e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
255f0 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
25600 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
25610 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pOp;.        if(
25620 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
25630 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
25640 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
25650 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
25660 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
25670 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
25680 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
25690 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
256a0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
256b0 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
256c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
256d0 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
256e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
256f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25700 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
25710 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
25720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25730 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
25740 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
25750 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25760 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
25770 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
25780 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
25790 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
257a0 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
257b0 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
257c0 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
257d0 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
257e0 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
257f0 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
25800 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
25810 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20   elimination of 
25820 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75  x..**.** The xJu
25830 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20 64  mpIf parameter d
25840 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c  etermines detail
25850 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c  s:.**.**    NULL
25860 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
25870 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f      Store the bo
25880 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  olean result in 
25890 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20  reg[dest].**    
258a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
258b0 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  e:      Jump to 
258c0 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20  dest if true.** 
258d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
258e0 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20  False:     Jump 
258f0 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73 65  to dest if false
25900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49  .**.** The jumpI
25910 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  fNull parameter 
25920 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a  is ignored if xJ
25930 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a  umpIf is NULL..*
25940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
25950 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
25960 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
25970 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
25980 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25990 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
259a0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
259b0 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
259c0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
259d0 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
259e0 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
259f0 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65  ation or storage
25a00 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76   location */.  v
25a10 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72  oid (*xJump)(Par
25a20 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e  se*,Expr*,int,in
25a30 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f  t), /* Action to
25a40 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   take */.  int j
25a50 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
25a60 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
25a70 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
25a80 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72  NULL */.){. Expr
25a90 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
25aa0 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
25ab0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
25ac0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
25ad0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
25ae0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
25af0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
25b00 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
25b10 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
25b20 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
25b30 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
25b40 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
25b50 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
25b60 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
25b70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
25b80 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74  memset(&compLeft
25b90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25ba0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  ));.  memset(&co
25bb0 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65  mpRight, 0, size
25bc0 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
25bd0 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c  set(&exprAnd, 0,
25be0 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
25bf0 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
25c00 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
25c10 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
25c20 20 29 3b 0a 20 20 65 78 70 72 4e 6f 64 65 43 6f   );.  exprNodeCo
25c30 70 79 28 26 65 78 70 72 58 2c 20 70 45 78 70 72  py(&exprX, pExpr
25c40 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 65 78 70 72  ->pLeft);.  expr
25c50 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
25c60 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
25c70 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
25c80 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
25c90 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
25ca0 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
25cb0 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
25cc0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
25cd0 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
25ce0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
25cf0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
25d00 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
25d10 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
25d20 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
25d30 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
25d40 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
25d50 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
25d60 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
25d70 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70  ster(&exprX, exp
25d80 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
25d90 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
25da0 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78  Free1));.  if( x
25db0 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d  Jump ){.    xJum
25dc0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  p(pParse, &exprA
25dd0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
25de0 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
25df0 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
25e00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65  expression is be
25e10 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ing from the ON 
25e20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
25e30 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a  of a join.    **
25e40 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c   so that the sql
25e50 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25e60 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  et() routine wil
25e70 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
25e80 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20   move.    ** it 
25e90 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70  into the Parse.p
25ea0 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20  ConstExpr list. 
25eb0 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61   We should use a
25ec0 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69   new bit for thi
25ed0 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c  s,.    ** for cl
25ee0 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72  arity, but we ar
25ef0 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e  e out of bits in
25f00 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20   the Expr.flags 
25f10 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20  field so we.    
25f20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65  ** have to reuse
25f30 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
25f40 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a   bit.  Bummer. *
25f50 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67  /.    exprX.flag
25f60 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  s |= EP_FromJoin
25f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
25f80 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
25f90 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
25fa0 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
25fb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
25fc0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
25fd0 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
25fe0 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
25ff0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
26000 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26010 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26020 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26030 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26040 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26050 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26060 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
26070 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26080 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
26090 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
260a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
260b0 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
260c0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
260d0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
260e0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
260f0 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26100 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26110 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26120 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26130 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
26140 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
26150 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
26160 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26170 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26180 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
26190 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
261a0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
261b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
261c0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
261d0 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
261e0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
261f0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26200 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26210 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26220 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
26230 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26240 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26250 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Jump==0 );.}../*
26260 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
26270 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
26280 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
26290 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
262a0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
262b0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
262c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
262d0 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
262e0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
262f0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
26300 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26310 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
26320 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
26330 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
26340 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
26350 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
26360 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
26370 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
26380 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
26390 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
263a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
263b0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
263c0 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
263d0 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
263e0 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
263f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
26400 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
26410 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
26420 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
26430 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
26440 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
26450 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
26460 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
26470 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
26480 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
26490 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
264a0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
264b0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
264c0 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
264d0 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
264e0 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
264f0 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
26500 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
26510 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
26520 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
26530 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
26540 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
26550 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
26560 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26570 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
26580 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
26590 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
265a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
265b0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
265c0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
265d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
265e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
265f0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
26600 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
26610 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
26620 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
26630 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
26640 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
26650 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
26660 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
26670 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
26680 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
26690 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
266a0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
266b0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
266c0 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20 3d      Expr *pAlt =
266d0 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d 70   sqlite3ExprSimp
266e0 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78 70  lifiedAndOr(pExp
266f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  r);.      if( pA
26700 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20 20  lt!=pExpr ){.   
26710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26720 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26730 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  Alt, dest, jumpI
26740 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65  fNull);.      }e
26750 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  lse if( op==TK_A
26760 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ND ){.        in
26770 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
26780 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
26790 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  se);.        tes
267a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
267b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
267c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
267d0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
267e0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20  ->pLeft, d2,.   
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26800 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75          jumpIfNu
26810 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
26820 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 73  NULL);.        s
26830 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26840 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26850 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
26860 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
26880 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
26890 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
268a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
268b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
268c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
268d0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(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 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26900 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
26910 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26920 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26930 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
26940 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26950 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26970 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
26980 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26990 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
269a0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
269b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
269c0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
269d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
269e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
269f0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
26a00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
26a10 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e  ot;      /* IS N
26a20 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  OT TRUE or IS NO
26a30 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
26a40 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20   int isTrue;    
26a50 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
26a60 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
26a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26a80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26a90 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78       isNot = pEx
26aa0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f  pr->op2==TK_ISNO
26ab0 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  T;.      isTrue 
26ac0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
26ad0 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
26ae0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
26af0 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
26b00 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
26b10 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
26b20 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
26b30 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
26b40 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
26b50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26b60 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26b70 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
26b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b90 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26ba0 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26bb0 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26bd0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26be0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26bf0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
26c20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
26c30 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
26c40 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
26c50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
26c60 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
26c70 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
26c80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
26c90 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
26ca0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
26cb0 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
26cc0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
26cd0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
26ce0 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
26cf0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
26d00 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
26d10 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
26d20 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
26d30 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
26d40 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
26d50 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
26d60 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
26d70 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
26d80 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
26d90 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
26da0 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
26db0 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
26dc0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26dd0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
26de0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26df0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26e00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26e10 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26e20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
26e30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26e40 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26e50 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
26e60 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
26e70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26e80 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
26e90 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
26ea0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
26eb0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26ec0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
26ed0 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
26ee0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26ef0 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
26f00 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
26f10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26f20 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
26f30 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
26f40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26f50 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
26f60 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26f70 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
26f80 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
26f90 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26fa0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
26fb0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
26fc0 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
26fd0 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
26fe0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26ff0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
27000 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
27010 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
27020 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
27030 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27040 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27050 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
27060 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27070 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27080 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27090 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
270a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
270b0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
270c0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
270d0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
270e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
270f0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27100 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
27110 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27120 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27130 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27140 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27150 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27160 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27170 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27180 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27190 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
271a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
271b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
271c0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
271d0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
271e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
271f0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
27200 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
27210 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
27220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
27230 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
27240 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
27250 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
27260 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
27270 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27280 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27290 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
272a0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
272b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
272c0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
272d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
272e0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
272f0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
27300 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27310 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
27320 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27330 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27340 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27350 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
27360 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
27370 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27380 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27390 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
273a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
273b0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
273c0 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
273d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
273e0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
273f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27400 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27410 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
27420 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
27430 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27440 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
27450 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
27460 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
27470 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
27480 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
27490 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
274a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
274b0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
274c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
274d0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
274e0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
274f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
27500 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
27510 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
27520 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
27530 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
27540 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
27550 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
27560 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
27570 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27580 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
27590 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
275a0 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
275b0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
275c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
275d0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
275e0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
275f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
27600 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
27610 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
27620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27630 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
27640 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
27650 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
27660 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
27670 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
27680 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27690 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
276a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
276b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
276c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
276d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
276e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
276f0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
27700 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
27710 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27720 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
27730 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27740 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
27750 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
27760 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
27770 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
27780 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
27790 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
277a0 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
277b0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
277c0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
277d0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
277e0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
277f0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
27800 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
27810 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
27820 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
27830 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
27840 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
27850 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27860 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
27870 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
27880 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
27890 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
278a0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
278b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
278c0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
278d0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
278e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
278f0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
27900 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27910 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
27920 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
27930 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27940 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27950 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27960 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27970 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27980 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
27990 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
279a0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
279b0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
279c0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
279d0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
279e0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
279f0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
27a00 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
27a10 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
27a20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
27a30 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
27a40 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
27a50 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
27a60 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
27a70 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
27a80 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
27a90 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
27aa0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
27ab0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
27ac0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
27ad0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
27ae0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
27af0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
27b00 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
27b10 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
27b20 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
27b30 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
27b40 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
27b50 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
27b60 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
27b70 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
27b80 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
27b90 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
27ba0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
27bb0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
27bc0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
27bd0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27be0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27bf0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27c00 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27c10 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
27c20 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
27c30 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
27c40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
27c50 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
27c60 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
27c70 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
27c80 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
27c90 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
27ca0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
27cb0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
27cc0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
27cd0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27ce0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27cf0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27d00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27d10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
27d20 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
27d30 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
27d40 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27d50 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
27d60 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
27d70 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27d80 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
27d90 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
27da0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27db0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
27dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27dd0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
27de0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
27df0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27e00 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
27e10 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
27e20 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27e30 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
27e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27e50 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
27e60 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
27e70 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
27e80 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
27e90 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
27ea0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
27eb0 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c  Expr *pAlt = sql
27ec0 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
27ed0 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a  edAndOr(pExpr);.
27ee0 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d        if( pAlt!=
27ef0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  pExpr ){.       
27f00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27f10 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74  lse(pParse, pAlt
27f20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27f30 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ll);.      }else
27f40 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
27f50 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  TK_AND ){.      
27f60 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27f70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27f80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27f90 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27fa0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
27fb0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27fd0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27fe0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27ff0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28000 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
28010 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
28020 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
28030 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
28040 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28050 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
28070 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
28080 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28090 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20  eft, d2,.       
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51     jumpIfNull^SQ
280c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
280d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
280e0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
280f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
28100 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
28110 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28120 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28130 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
28140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28150 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
28160 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
28170 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28180 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28190 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
281a0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
281b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
281c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
281d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
281e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
281f0 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
28200 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20   isNot;   /* IS 
28210 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
28220 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
28230 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f    int isTrue;  /
28240 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
28250 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
28260 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28270 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28280 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
28290 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
282a0 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
282b0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
282c0 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
282d0 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
282e0 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
282f0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
28300 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
28310 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
28320 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
28330 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
28340 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20   /* IS TRUE and 
28350 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
28360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28370 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
28380 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28390 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
283c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
283d0 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
283e0 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41          /* IS FA
283f0 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54  LSE and IS NOT T
28400 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  RUE */.        s
28410 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
28420 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28430 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28460 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28470 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
28480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28490 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
284a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
284b0 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
284c0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
284d0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
284e0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
284f0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
28500 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
28510 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
28520 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
28530 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
28540 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
28550 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
28560 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
28570 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
28580 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
28590 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
285a0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
285b0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
285c0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
285d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
285e0 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
285f0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
28600 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
28610 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28620 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28630 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28640 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28650 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28660 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28670 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
28680 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28690 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
286a0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
286b0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
286c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
286d0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
286e0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
286f0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
28700 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
28710 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
28720 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
28730 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28740 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
28750 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
28760 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28770 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
28780 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28790 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
287a0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
287b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
287c0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
287d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
287e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
287f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
28800 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28810 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
28820 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
28830 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28840 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
28850 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
28860 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
28870 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
28880 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28890 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
288a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
288b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
288c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
288d0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
288e0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
288f0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28910 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
28920 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
28930 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28940 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
28950 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
28960 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
28970 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28980 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28990 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
289a0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
289b0 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
289c0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
289d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
289e0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
289f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28a00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28a10 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
28a20 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
28a30 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28a40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28a50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28a60 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28a80 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
28a90 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
28aa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28ab0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
28ac0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28ad0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
28ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28af0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
28b00 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
28b10 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
28b20 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
28b30 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
28b40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
28b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28b60 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
28b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28b80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28b90 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
28ba0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
28bb0 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
28bc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a  e3ExprIfFalse, j
28bd0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28bf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28c00 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28c10 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
28c20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
28c30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
28c40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28c50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28c60 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
28c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28c80 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
28c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28ca0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
28cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28cc0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
28cd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
28ce0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28d00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
28d10 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28d20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28d30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28d40 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
28d50 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
28d60 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41 6c        if( ExprAl
28d70 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
28d80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28d90 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
28da0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
28db0 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
28dc0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
28dd0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
28de0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
28df0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
28e00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
28e10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28e20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28e40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
28e50 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
28e60 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
28e70 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28e80 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
28e90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
28ea0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
28eb0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28ec0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28ed0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
28ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
28ef0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
28f00 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
28f10 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
28f20 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
28f30 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
28f40 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
28f50 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28f60 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
28f70 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
28f80 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
28f90 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
28fa0 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
28fb0 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
28fc0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
28fd0 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
28fe0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
28ff0 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29000 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
29010 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29020 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
29030 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
29040 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
29050 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
29060 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29070 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29080 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29090 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
290a0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
290b0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
290c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
290d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
290e0 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
290f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29100 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
29110 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
29120 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
29130 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
29140 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
29150 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
29160 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
29170 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
29180 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29190 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
291a0 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
291b0 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
291c0 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
291d0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
291e0 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
291f0 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29200 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
29210 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29220 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
29230 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
29240 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
29250 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
29260 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
29270 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29280 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29290 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
292a0 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
292b0 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
292c0 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
292d0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
292e0 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
292f0 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29300 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
29310 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29320 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
29330 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
29340 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29350 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29360 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29370 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29380 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29390 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
293a0 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
293b0 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
293c0 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
293d0 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
293e0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
293f0 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29400 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
29410 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29420 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
29430 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
29440 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
29450 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
29460 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
29470 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
29480 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29490 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
294a0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
294b0 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
294c0 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
294d0 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
294e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
294f0 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
29500 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
29510 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29520 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
29530 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
29540 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
29550 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
29560 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
29570 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
29580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29590 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
295a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
295b0 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
295c0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
295d0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
295e0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
295f0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
29600 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
29610 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29620 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
29630 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
29640 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
29650 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
29660 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
29670 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
29680 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
29690 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
296a0 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
296b0 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
296c0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
296d0 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
296e0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
296f0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
29700 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
29710 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29720 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
29730 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
29740 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
29750 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
29760 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
29770 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
29780 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
29790 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
297a0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
297b0 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
297c0 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
297d0 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
297e0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
297f0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
29800 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
29810 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
29820 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
29830 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
29840 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
29850 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
29860 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
29870 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
29880 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
29890 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
298a0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
298b0 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
298c0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
298d0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
298e0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
298f0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
29900 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
29910 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29920 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
29930 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
29940 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
29950 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
29960 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
29970 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
29980 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
29990 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
299a0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
299b0 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
299c0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
299d0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
299e0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
299f0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
29a00 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
29a10 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
29a20 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
29a30 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
29a40 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
29a50 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
29a60 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
29a70 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
29a80 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
29a90 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
29aa0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
29ab0 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
29ac0 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
29ad0 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
29ae0 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
29af0 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
29b00 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
29b10 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
29b20 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
29b30 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
29b40 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
29b50 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
29b60 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
29b70 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
29b80 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
29b90 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
29ba0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
29bb0 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
29bc0 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
29bd0 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
29be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
29bf0 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
29c00 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
29c10 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
29c20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
29c30 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
29c40 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
29c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
29c60 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
29c70 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
29c80 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
29c90 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
29ca0 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
29cb0 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
29cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
29cd0 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
29ce0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
29cf0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
29d00 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
29d10 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
29d20 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
29d30 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
29d40 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
29d50 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
29d60 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
29d70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29d80 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
29d90 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
29da0 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20 70  >op!=pB->op || p
29db0 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45 20  A->op==TK_RAISE 
29dc0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
29dd0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
29de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29df0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29e00 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
29e10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29e20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
29e30 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
29e40 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29e50 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29e60 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
29e70 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
29e80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
29e90 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
29ea0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
29eb0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
29ec0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
29ed0 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
29ee0 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
29ef0 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
29f00 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
29f10 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29f20 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29f30 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29f40 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65 66  eturn 2;.#ifndef
29f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
29f60 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 2f 2a  DOWFUNC.      /*
29f70 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   Justification f
29f80 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29 3a  or the assert():
29f90 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77  .      ** window
29fa0 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
29fb0 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
29fc0 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74 65  ON but aggregate
29fd0 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20   functions.     
29fe0 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d   ** have p->op==
29ff0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
2a000 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72 69    So any compari
2a010 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20 61  son between an a
2a020 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20 2a  ggregate.      *
2a030 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 61  * function and a
2a040 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a050 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69   should have fai
2a060 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61 63 68  led before reach
2a070 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
2a080 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20 69  s point.  And, i
2a090 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
2a0a0 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e 64  e to have a wind
2a0b0 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  ow function and.
2a0c0 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61 6c 61        ** a scala
2a0d0 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  r function with 
2a0e0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 6e  the same name an
2a0f0 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  d number of argu
2a100 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20 20  ments.  So.     
2a110 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68 20   ** if we reach 
2a120 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68  this point, eith
2a130 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20  er A and B both 
2a140 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
2a150 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e 65 69   or.      ** nei
2a160 74 68 65 72 20 61 72 65 20 61 20 77 69 6e 64 6f  ther are a windo
2a170 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a  w functions. */.
2a180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2a190 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
2a1a0 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d 45 78  ,EP_WinFunc)==Ex
2a1b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
2a1c0 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a  ,EP_WinFunc) );.
2a1d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
2a1e0 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f  sProperty(pA,EP_
2a1f0 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
2a200 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2a210 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50 61  indowCompare(pPa
2a220 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e 2c 70  rse,pA->y.pWin,p
2a230 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20 29 20  B->y.pWin)!=0 ) 
2a240 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
2a250 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
2a260 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54  se if( pA->op==T
2a270 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  K_NULL ){.      
2a280 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
2a290 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
2a2a0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
2a2b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a2c0 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54  stricmp(pA->u.zT
2a2d0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
2a2e0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
2a2f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a300 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e 7a 54 6f  ALWAYS(pB->u.zTo
2a310 6b 65 6e 21 3d 30 29 20 26 26 20 73 74 72 63 6d  ken!=0) && strcm
2a320 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2a330 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2a340 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a350 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2a360 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
2a370 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
2a380 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
2a390 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
2a3a0 20 32 3b 0a 20 20 69 66 28 20 28 63 6f 6d 62 69   2;.  if( (combi
2a3b0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f  nedFlags & EP_To
2a3c0 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20  kenOnly)==0 ){. 
2a3d0 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
2a3e0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
2a3f0 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
2a400 20 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65      if( (combine
2a410 64 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65  dFlags & EP_Fixe
2a420 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  dCol)==0.     &&
2a430 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a440 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a450 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
2a460 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2a470 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a480 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a490 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68  Parse, pA->pRigh
2a4a0 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
2a4b0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
2a4c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a4d0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2a4e0 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
2a4f0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
2a500 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a510 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53  if( pA->op!=TK_S
2a520 54 52 49 4e 47 0a 20 20 20 20 20 26 26 20 70 41  TRING.     && pA
2a530 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op!=TK_TRUEFAL
2a540 53 45 0a 20 20 20 20 20 26 26 20 28 63 6f 6d 62  SE.     && (comb
2a550 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2a560 65 64 75 63 65 64 29 3d 3d 30 0a 20 20 20 20 29  educed)==0.    )
2a570 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
2a580 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
2a590 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
2a5a0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
2a5b0 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
2a5c0 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
2a5d0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
2a5e0 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
2a5f0 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
2a600 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
2a610 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2a620 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
2a630 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
2a640 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
2a650 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
2a660 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
2a670 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
2a680 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
2a690 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
2a6a0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
2a6b0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
2a6c0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
2a6d0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
2a6e0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
2a6f0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
2a700 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
2a710 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
2a720 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a730 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
2a740 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
2a750 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
2a760 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
2a770 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
2a780 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
2a790 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
2a7a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a7b0 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
2a7c0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
2a7d0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
2a7e0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
2a7f0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
2a800 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
2a810 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
2a820 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
2a830 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
2a840 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
2a850 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
2a860 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
2a870 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
2a880 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
2a890 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2a8a0 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
2a8b0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
2a8c0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
2a8d0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
2a8e0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
2a8f0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
2a900 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
2a910 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
2a920 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
2a930 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
2a940 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
2a950 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
2a960 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
2a970 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2a980 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
2a990 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
2a9a0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
2a9b0 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
2a9c0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
2a9d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2a9e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a9f0 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 41  ompare(0, pExprA
2aa00 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
2aa10 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
2aa20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2aa30 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
2aa40 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65  3ExprCompare() e
2aa50 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70  xcept COLLATE op
2aa60 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20 74  erators at the t
2aa70 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20  op-level.** are 
2aa80 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
2aa90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2aaa0 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c  reSkip(Expr *pA,
2aab0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
2aac0 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
2aad0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2aae0 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e(0,.           
2aaf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
2ab00 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20  pCollate(pA),.  
2ab10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ab20 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2ab30 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20  e(pB),.         
2ab40 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a      iTab);.}../*
2ab50 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
2ab60 65 72 6f 20 69 66 20 45 78 70 72 20 70 20 63 61  ero if Expr p ca
2ab70 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2ab80 66 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c  f pNN is not NUL
2ab90 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
2aba0 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e   exprImpliesNotN
2abb0 75 6c 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ull(.  Parse *pP
2abc0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
2abd0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2abe0 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20 20 20  .  Expr *p,     
2abf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
2ac00 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 63  pression to be c
2ac10 68 65 63 6b 65 64 20 2a 2f 0a 20 20 45 78 70 72  hecked */.  Expr
2ac20 20 2a 70 4e 4e 2c 20 20 20 20 20 20 20 20 20 20   *pNN,          
2ac30 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2ac40 6e 20 74 68 61 74 20 69 73 20 4e 4f 54 20 4e 55  n that is NOT NU
2ac50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  LL */.  int iTab
2ac60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2ac70 61 62 6c 65 20 62 65 69 6e 67 20 65 76 61 6c 75  able being evalu
2ac80 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  ated */.  int se
2ac90 65 6e 4e 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  enNot         /*
2aca0 20 54 72 75 65 20 69 66 20 70 20 69 73 20 61 6e   True if p is an
2acb0 20 6f 70 65 72 61 6e 64 20 6f 66 20 4e 4f 54 20   operand of NOT 
2acc0 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
2acd0 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
2ace0 4e 4e 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  NN );.  if( sqli
2acf0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2ad00 50 61 72 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69  Parse, p, pNN, i
2ad10 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tab)==0 ) return
2ad20 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d   1;.  switch( p-
2ad30 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2ad40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
2ad50 66 28 20 73 65 65 6e 4e 6f 74 20 26 26 20 45 78  f( seenNot && Ex
2ad60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2ad70 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2ad80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2ad90 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
2ada0 50 72 6f 70 65 72 74 79 28 70 2c 45 50 5f 78 49  Property(p,EP_xI
2adb0 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20 20 20  sSelect).       
2adc0 20 20 20 20 7c 7c 20 28 70 2d 3e 78 2e 70 4c 69      || (p->x.pLi
2add0 73 74 21 3d 30 20 26 26 20 70 2d 3e 78 2e 70 4c  st!=0 && p->x.pL
2ade0 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 3b  ist->nExpr>0) );
2adf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 78  .      return ex
2ae00 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2ae10 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66  (pParse, p->pLef
2ae20 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65  t, pNN, iTab, se
2ae30 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  enNot);.    }.  
2ae40 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
2ae50 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
2ae60 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e  ist *pList = p->
2ae70 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
2ae80 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2ae90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2aea0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
2aeb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
2aec0 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20 30  enNot ) return 0
2aed0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  ;.      if( expr
2aee0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70  ImpliesNotNull(p
2aef0 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
2af00 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20 69  0].pExpr, pNN, i
2af10 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 0a 20 20  Tab, seenNot).  
2af20 20 20 20 20 20 7c 7c 20 65 78 70 72 49 6d 70 6c       || exprImpl
2af30 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73  iesNotNull(pPars
2af40 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  e, pList->a[1].p
2af50 45 78 70 72 2c 20 70 4e 4e 2c 20 69 54 61 62 2c  Expr, pNN, iTab,
2af60 20 73 65 65 6e 4e 6f 74 29 0a 20 20 20 20 20 20   seenNot).      
2af70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2af80 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2af90 20 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 6d     return exprIm
2afa0 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61  pliesNotNull(pPa
2afb0 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 70  rse, p->pLeft, p
2afc0 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f  NN, iTab, seenNo
2afd0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  t);.    }.    ca
2afe0 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
2aff0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
2b000 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
2b010 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
2b020 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
2b030 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
2b040 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
2b050 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
2b060 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
2b070 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
2b080 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
2b090 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
2b0a0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
2b0b0 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
2b0c0 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
2b0d0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
2b0e0 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
2b0f0 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
2b100 20 69 66 28 20 65 78 70 72 49 6d 70 6c 69 65 73   if( exprImplies
2b110 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2b120 70 2d 3e 70 52 69 67 68 74 2c 20 70 4e 4e 2c 20  p->pRight, pNN, 
2b130 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 20 29  iTab, seenNot) )
2b140 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2b150 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
2b160 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
2b170 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
2b180 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
2b190 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
2b1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
2b1b0 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2b1c0 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  _UPLUS:.    case
2b1d0 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
2b1e0 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 72 49      return exprI
2b1f0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2b200 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  arse, p->pLeft, 
2b210 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e  pNN, iTab, seenN
2b220 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ot);.    }.    c
2b230 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
2b240 20 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f        if( seenNo
2b250 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
2b260 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 32 21 3d      if( p->op2!=
2b270 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e 20 30  TK_IS ) return 0
2b280 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  ;.      return e
2b290 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2b2a0 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2b2b0 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73  ft, pNN, iTab, s
2b2c0 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a 20  eenNot);.    }. 
2b2d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
2b2e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  {.      return e
2b2f0 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2b300 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2b310 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 31  ft, pNN, iTab, 1
2b320 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2b330 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2b340 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2b350 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
2b360 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
2b370 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
2b380 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
2b390 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
2b3a0 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
2b3b0 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
2b3c0 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
2b3d0 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
2b3e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
2b3f0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
2b400 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
2b410 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2b420 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
2b430 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
2b450 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
2b460 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
2b470 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
2b480 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
2b490 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2b4a0 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
2b4b0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2b4c0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2b4d0 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
2b4e0 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
2b4f0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
2b500 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2b510 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
2b520 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2b530 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
2b540 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
2b550 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
2b560 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2b570 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
2b580 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
2b590 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
2b5a0 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
2b5b0 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
2b5c0 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
2b5d0 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
2b5e0 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
2b5f0 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
2b600 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69  *.** If pParse i
2b610 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2b620 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
2b630 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69  ound variables i
2b640 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f  n pE1 are .** co
2b650 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c  mpared against l
2b660 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e  iteral values in
2b670 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d   pE2 and pParse-
2b680 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
2b690 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  is.** modified t
2b6a0 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20 62  o record which b
2b6b0 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61  ound variables a
2b6c0 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20  re referenced.  
2b6d0 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73  If pParse .** is
2b6e0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73   NULL, then fals
2b6f0 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  e will be return
2b700 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69  ed if pE1 contai
2b710 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72  ns any bound var
2b720 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  iables..**.** Wh
2b730 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
2b740 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
2b750 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
2b760 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
2b770 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
2b780 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
2b790 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
2b7a0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
2b7b0 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
2b7c0 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
2b7d0 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
2b7e0 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
2b7f0 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
2b800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b810 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2b820 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2b830 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
2b840 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
2b850 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2b860 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2b870 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29   pE1, pE2, iTab)
2b880 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2b890 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2b8a0 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
2b8b0 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
2b8c0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72  ImpliesExpr(pPar
2b8d0 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c  se, pE1, pE2->pL
2b8e0 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20  eft, iTab).     
2b8f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b900 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2b910 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  r(pParse, pE1, p
2b920 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
2b930 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
2b940 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2b950 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
2b960 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78 70 72 49  NULL.   && exprI
2b970 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 70 50  mpliesNotNull(pP
2b980 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2b990 70 4c 65 66 74 2c 20 69 54 61 62 2c 20 30 29 0a  pLeft, iTab, 0).
2b9a0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2b9b0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2b9c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
2b9d0 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f 64   is the Expr nod
2b9e0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73  e callback for s
2b9f0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2ba00 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a  sNotNullRow()..*
2ba10 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2ba20 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72 65  ion node require
2ba30 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
2ba40 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75   at pWalker->iCu
2ba50 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65 20 6f 72  r.** have one or
2ba60 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 63   more non-NULL c
2ba70 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20  olumn, then set 
2ba80 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
2ba90 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  o 1 and abort..*
2baa0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bab0 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f 70  e controls an op
2bac0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 61 6c  timization.  Fal
2bad0 73 65 20 70 6f 73 69 74 69 76 65 73 20 28 73 65  se positives (se
2bae0 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65 72  tting.** pWalker
2baf0 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 77 68 65  ->eCode to 1 whe
2bb00 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  n it should not 
2bb10 62 65 29 20 61 72 65 20 64 65 61 64 6c 79 2c 20  be) are deadly, 
2bb20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67 61 74 69  but false-negati
2bb30 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72 20 73 65  ves.** (never se
2bb40 74 74 69 6e 67 20 70 57 61 6c 6b 65 72 2d 3e 65  tting pWalker->e
2bb50 43 6f 64 65 29 20 69 73 20 61 20 68 61 72 6d 6c  Code) is a harml
2bb60 65 73 73 20 6d 69 73 73 65 64 20 6f 70 74 69 6d  ess missed optim
2bb70 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ization..*/.stat
2bb80 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f  ic int impliesNo
2bb90 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20  tNullRow(Walker 
2bba0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2bbb0 70 45 78 70 72 29 7b 0a 20 20 74 65 73 74 63 61  pExpr){.  testca
2bbc0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bbd0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2bbe0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bbf0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2bc00 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
2bc10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2bc20 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
2bc30 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  in) ) return WRC
2bc40 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74 63 68  _Prune;.  switch
2bc50 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2bc60 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
2bc70 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
2bc80 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
2bc90 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
2bca0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20  TK_NOTNULL:.    
2bcb0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2bcc0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2bcd0 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2bce0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2bcf0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2bd00 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2bd10 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bd20 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2bd30 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bd40 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2bd50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bd60 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2bd70 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2bd80 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2bd90 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
2bda0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bdb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2bdc0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
2bdd0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2bde0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
2bdf0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2be00 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20  op==TK_CASE );. 
2be10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2be20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2be30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2be40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2be50 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
2be60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2be70 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  une;.    case TK
2be80 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69  _COLUMN:.      i
2be90 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  f( pWalker->u.iC
2bea0 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  ur==pExpr->iTabl
2beb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61  e ){.        pWa
2bec0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2bed0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2bee0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2bef0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2bf00 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20  WRC_Prune;..    
2bf10 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
2bf20 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
2bf30 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   use constraints
2bf40 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53   like x=NULL.  S
2bf50 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20  o.    ** a term 
2bf60 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20  of the form x=y 
2bf70 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74  does not prove t
2bf80 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c  hat y is not nul
2bf90 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73  l if x.    ** is
2bfa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   the column of a
2bfb0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2bfc0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  /.    case TK_EQ
2bfd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
2bfe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  :.    case TK_LT
2bff0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
2c000 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
2c010 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
2c020 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
2c030 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c040 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
2c050 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c060 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
2c070 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c080 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20  >op==TK_LT );.  
2c090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c0a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29  xpr->op==TK_LE )
2c0b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c0c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c0d0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
2c0e0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c0f0 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
2c100 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  if( (pExpr->pLef
2c110 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2c120 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45   && IsVirtual(pE
2c130 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54  xpr->pLeft->y.pT
2c140 61 62 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ab)).       || (
2c150 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f  pExpr->pRight->o
2c160 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
2c170 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d  IsVirtual(pExpr-
2c180 3e 70 52 69 67 68 74 2d 3e 79 2e 70 54 61 62 29  >pRight->y.pTab)
2c190 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2c1a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c1b0 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
2c1c0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
2c1d0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2c1e0 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ue;.  }.}../*.**
2c1f0 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
2c200 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65  n-zero) if expre
2c210 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79  ssion p can only
2c220 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20 6c   be true if at l
2c230 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75  east.** one colu
2c240 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62  mn of table iTab
2c250 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49   is non-null.  I
2c260 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
2c270 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
2c280 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2c290 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c  ll always be NUL
2c2a0 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76  L or false if ev
2c2b0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2c2c0 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  ab.** is NULL..*
2c2d0 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74  *.** False negat
2c2e0 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74 61  ives are accepta
2c2f0 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
2c300 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74  ords, it is ok t
2c310 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  o return.** zero
2c320 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73 73   even if express
2c330 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72  ion p will never
2c340 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65 72   be true of ever
2c350 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2c360 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20  .** is NULL.  A 
2c370 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69  false negative i
2c380 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65  s merely a misse
2c390 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  d optimization o
2c3a0 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a  pportunity..**.*
2c3b0 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65  * False positive
2c3c0 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
2c3d0 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66  d, however.  A f
2c3e0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61  alse positive ma
2c3f0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
2c400 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
2c410 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  er..**.** Terms 
2c420 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d 61  of p that are ma
2c430 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f  rked with EP_Fro
2c440 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65  mJoin (and hence
2c450 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a   that come from.
2c460 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
2c470 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45  NG clauses of LE
2c480 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78  FT JOINS) are ex
2c490 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
2c4a0 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20  analysis..**.** 
2c4b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2c4c0 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
2c4d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
2c4e0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2c4f0 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
2c500 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61  y JOIN.  The p a
2c510 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57  rgument is the W
2c520 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66  HERE clause.  If
2c530 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2c540 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74 68  ause requires th
2c550 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f  at some column o
2c560 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2c570 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  e of the LEFT JO
2c580 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c  IN.** be non-NUL
2c590 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54  L, then the LEFT
2c5a0 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66   JOIN can be saf
2c5b0 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  ely converted in
2c5c0 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  to an.** ordinar
2c5d0 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  y join..*/.int s
2c5e0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2c5f0 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72  sNonNullRow(Expr
2c600 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a   *p, int iTab){.
2c610 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 70 20    Walker w;.  p 
2c620 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2c630 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 77  pCollate(p);.  w
2c640 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
2c650 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54  f( p->op==TK_NOT
2c660 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 20  NULL ){.      p 
2c670 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
2c680 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
2c690 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
2c6a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2c6b0 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2c6c0 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  w(p->pLeft, iTab
2c6d0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2c6e0 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
2c6f0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2c700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c710 0a 20 20 7d 0a 20 20 77 2e 78 45 78 70 72 43 61  .  }.  w.xExprCa
2c720 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73  llback = implies
2c730 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e  NotNullRow;.  w.
2c740 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2c750 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  = 0;.  w.xSelect
2c760 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2c770 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20   w.eCode = 0;.  
2c780 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b  w.u.iCur = iTab;
2c790 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2c7a0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
2c7b0 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
2c7c0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2c7d0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2c7e0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2c7f0 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2c800 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
2c810 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
2c820 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2c830 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
2c840 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
2c850 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
2c860 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
2c870 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
2c880 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2c890 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
2c8a0 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
2c8b0 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
2c8c0 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
2c8d0 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
2c8e0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
2c8f0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
2c900 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
2c910 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
2c920 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2c930 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
2c940 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
2c950 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
2c960 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2c970 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
2c980 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
2c990 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
2c9a0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
2c9b0 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
2c9c0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2c9d0 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
2c9e0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2c9f0 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
2ca00 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
2ca10 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
2ca20 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2ca30 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
2ca40 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
2ca50 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
2ca60 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2ca70 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2ca80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
2ca90 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
2caa0 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
2cab0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
2cac0 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
2cad0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
2cae0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2caf0 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
2cb00 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
2cb10 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2cb20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
2cb30 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
2cb40 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2cb50 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2cb60 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
2cb70 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
2cb80 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
2cb90 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
2cba0 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
2cbb0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
2cbc0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2cbd0 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
2cbe0 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2cbf0 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
2cc00 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2cc10 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
2cc20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
2cc30 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
2cc40 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
2cc50 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
2cc60 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
2cc70 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
2cc80 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
2cc90 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
2cca0 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
2ccb0 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
2ccc0 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
2ccd0 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
2cce0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2ccf0 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
2cd00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2cd10 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
2cd20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
2cd30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2cd40 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2cd50 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
2cd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cd70 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2cd80 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
2cd90 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
2cda0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2cdb0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2cdc0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
2cdd0 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
2cde0 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
2cdf0 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
2ce00 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
2ce10 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2ce20 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
2ce30 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
2ce40 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
2ce50 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2ce60 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
2ce70 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
2ce80 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
2ce90 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2cea0 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
2ceb0 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
2cec0 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2ced0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2cee0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2cef0 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2cf00 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
2cf10 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
2cf20 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
2cf30 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
2cf40 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
2cf50 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
2cf60 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
2cf70 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
2cf80 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
2cf90 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
2cfa0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2cfb0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2cfc0 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
2cfd0 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
2cfe0 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
2cff0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
2d000 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
2d010 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2d020 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2d030 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
2d040 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
2d050 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2d060 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2d070 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
2d080 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
2d090 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
2d0a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2d0b0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
2d0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2d0d0 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
2d0e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2d0f0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2d100 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
2d110 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
2d120 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
2d130 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2d140 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
2d150 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
2d160 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
2d170 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2d180 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
2d190 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
2d1a0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
2d1b0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
2d1c0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
2d1d0 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
2d1e0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2d1f0 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
2d200 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
2d210 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
2d220 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
2d230 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
2d240 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2d250 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
2d260 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
2d270 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2d280 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2d290 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
2d2a0 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
2d2b0 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
2d2c0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2d2d0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2d2e0 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
2d2f0 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
2d300 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2d310 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
2d320 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2d330 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
2d340 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
2d350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d360 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
2d370 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
2d380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
2d390 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
2d3a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2d3b0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2d3c0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
2d3d0 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
2d3e0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
2d3f0 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
2d400 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
2d410 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
2d420 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
2d430 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
2d440 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
2d450 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
2d460 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
2d470 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
2d480 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2d490 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
2d4a0 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
2d4b0 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
2d4c0 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
2d4d0 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
2d4e0 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
2d4f0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
2d500 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
2d510 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
2d520 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2d530 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
2d540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2d550 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2d560 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45  NCTION );.  w.xE
2d570 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2d580 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
2d590 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2d5a0 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  = 0;.  w.u.pSrcC
2d5b0 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
2d5c0 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
2d5d0 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
2d5e0 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
2d5f0 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
2d600 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
2d610 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
2d620 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
2d630 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
2d640 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
2d650 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2d660 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2d670 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
2d680 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2d690 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2d6a0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2d6b0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2d6c0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2d6d0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2d6e0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
2d6f0 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
2d700 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2d710 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2d720 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
2d730 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2d740 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
2d750 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
2d760 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
2d770 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
2d780 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2d790 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
2d7a0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2d7b0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2d7c0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2d7d0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
2d7e0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
2d7f0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2d800 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2d810 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2d820 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2d830 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2d840 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2d850 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
2d860 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
2d870 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2d880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2d890 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
2d8a0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
2d8b0 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
2d8c0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
2d8d0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
2d8e0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
2d8f0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2d900 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
2d910 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2d920 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2d930 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
2d940 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
2d950 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
2d960 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
2d970 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
2d980 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2d990 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
2d9a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2d9b0 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
2d9c0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2d9d0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2d9e0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2d9f0 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
2da00 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2da10 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
2da20 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
2da30 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
2da40 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
2da50 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
2da60 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
2da70 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
2da80 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
2da90 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
2daa0 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e   pNC->uNC.pAggIn
2dab0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  fo;..  assert( p
2dac0 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2dad0 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73  _UAggInfo );.  s
2dae0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2daf0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2db00 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
2db10 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2db20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2db30 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2db40 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
2db50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2db60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2db70 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
2db80 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2db90 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
2dba0 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
2dbb0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2dbc0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2dbd0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2dbe0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
2dbf0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
2dc00 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
2dc10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2dc20 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
2dc30 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
2dc40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
2dc50 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2dc60 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2dc70 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2dc80 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
2dc90 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2dca0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2dcb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2dcc0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2dcd0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
2dce0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2dcf0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2dd00 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
2dd10 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2dd20 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2dd30 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
2dd40 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
2dd50 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2dd60 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
2dd70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2dd80 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2dd90 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
2dda0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2ddb0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
2ddc0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
2ddd0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
2dde0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
2ddf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2de00 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
2de10 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2de20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2de30 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
2de40 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2de50 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
2de60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2de70 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
2de80 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
2de90 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
2dea0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2deb0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2dec0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2dee0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
2def0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2df10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2df20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2df30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2df40 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
2df50 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
2df60 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
2df70 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2df80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2df90 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
2dfa0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2dfb0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
2dfc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
2dfd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2dfe0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
2dff0 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
2e000 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e010 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
2e020 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
2e030 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2e040 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
2e050 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
2e060 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
2e070 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e090 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e0a0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2e0b0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
2e0c0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2e0d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e0e0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2e0f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2e100 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2e120 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
2e130 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2e140 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2e150 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2e160 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
2e170 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
2e180 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
2e190 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2e1a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2e1b0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
2e1c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2e1d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2e1e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2e1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e200 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2e210 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
2e220 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2e230 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e250 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
2e260 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e280 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e290 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e2b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e2c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e2d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e2e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e2f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2e300 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2e310 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2e320 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2e330 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
2e340 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
2e350 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
2e360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e380 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2e390 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
2e3a0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
2e3b0 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
2e3c0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2e3d0 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
2e3e0 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
2e3f0 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
2e400 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
2e410 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
2e420 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
2e430 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
2e440 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
2e450 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2e460 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
2e470 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
2e480 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e490 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2e4a0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2e4b0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2e4c0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e4d0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2e4e0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2e4f0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2e500 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
2e510 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e520 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
2e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2e540 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
2e550 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
2e560 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
2e570 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
2e580 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
2e590 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
2e5a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2e5b0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2e5c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e5d0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2e5e0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
2e5f0 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2e600 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
2e610 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
2e620 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
2e630 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
2e640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2e650 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
2e660 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
2e670 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
2e680 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
2e690 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
2e6a0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2e6b0 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
2e6c0 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
2e6d0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2e6e0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
2e6f0 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
2e700 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
2e710 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e720 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2e730 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2e740 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2e750 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49  xprCompare(0, pI
2e760 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
2e770 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
2e780 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e7b0 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
2e7c0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
2e7d0 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
2e7e0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
2e7f0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
2e800 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
2e810 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e820 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
2e830 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
2e840 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
2e850 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
2e860 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2e870 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2e880 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
2e890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e8a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e8b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2e8c0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
2e8d0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
2e8e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2e900 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
2e910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2e920 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
2e930 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e950 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e960 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
2e970 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2e980 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
2e990 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
2e9a0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
2e9b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2e9c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
2e9d0 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
2e9e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e9f0 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
2ea00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
2ea10 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ea30 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
2ea40 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2ea60 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
2ea70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ea80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2ea90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2eaa0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2eab0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2eac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ead0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eae0 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
2eaf0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
2eb00 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
2eb10 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
2eb20 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
2eb30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2eb40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2eb50 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2eb60 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2eb70 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
2eb80 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2eb90 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2eba0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2ebb0 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
2ebc0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2ebd0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2ebe0 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
2ebf0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2ec00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2ec20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2ec30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ec40 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ec50 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
2ec60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2ec70 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
2ec80 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2ec90 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
2eca0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
2ecb0 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72  lect);.  pWalker
2ecc0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b  ->walkerDepth++;
2ecd0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ece0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2ecf0 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67   void analyzeAgg
2ed00 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2ed10 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nd(Walker *pWalk
2ed20 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2ed30 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2ed40 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2ed50 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2ed60 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a  lkerDepth--;.}..
2ed70 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2ed80 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2ed90 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2eda0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2edb0 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2edc0 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2edd0 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2ede0 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2edf0 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2ee00 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2ee10 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2ee20 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2ee30 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2ee40 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2ee50 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2ee60 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2ee70 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2ee80 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2ee90 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2eea0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2eeb0 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2eec0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2eed0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2eee0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2eef0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2ef00 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2ef10 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2ef20 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2ef30 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
2ef40 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2ef50 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2ef60 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
2ef70 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2ef80 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  k2 = analyzeAggr
2ef90 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2efa0 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70  d;.  w.walkerDep
2efb0 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e  th = 0;.  w.u.pN
2efc0 43 20 3d 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61  C = pNC;.  w.pPa
2efd0 72 73 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  rse = 0;.  asser
2efe0 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
2eff0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
2f000 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2f010 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
2f020 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
2f030 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2f040 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
2f050 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
2f060 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
2f070 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
2f080 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
2f090 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2f0a0 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
2f0b0 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
2f0c0 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
2f0d0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f0e0 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
2f0f0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
2f100 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
2f110 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2f120 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
2f130 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
2f140 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
2f150 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
2f160 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
2f170 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2f180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f190 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f1a0 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
2f1b0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2f1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2f1d0 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
2f1e0 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
2f1f0 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
2f200 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2f210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f220 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
2f230 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
2f240 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2f250 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
2f260 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
2f270 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
2f280 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2f290 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
2f2a0 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
2f2b0 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
2f2c0 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
2f2d0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2f2e0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
2f2f0 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76  ** purpose..*/.v
2f300 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2f310 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
2f320 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2f330 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
2f340 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
2f350 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
2f360 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
2f370 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  {.    pParse->aT
2f380 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
2f390 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
2f3a0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2f3b0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
2f3c0 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
2f3d0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
2f3e0 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f  ve registers..*/
2f3f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2f400 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2f410 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
2f420 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
2f430 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72   if( nReg==1 ) r
2f440 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74  eturn sqlite3Get
2f450 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2f460 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
2f470 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
2f480 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f490 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
2f4a0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2f4b0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
2f4c0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
2f4d0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
2f4e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2f4f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2f500 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
2f510 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
2f520 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
2f530 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2f540 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
2f550 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2f560 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
2f570 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
2f580 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2f590 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2f5a0 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65  e, iReg);.    re
2f5b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
2f5c0 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
2f5d0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
2f5e0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2f5f0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2f600 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
2f610 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2f620 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
2f630 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
2f640 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
2f650 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
2f660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2f670 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2f680 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2f690 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
2f6a0 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
2f6b0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2f6c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
2f6d0 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
2f6e0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
2f6f0 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
2f700 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
2f710 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
2f720 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
2f730 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2f740 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
2f750 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
2f760 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
2f770 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
2f780 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
2f790 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2f7a0 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
2f7b0 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
2f7c0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
2f7d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
2f7e0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2f7f0 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
2f800 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72  nRangeReg > iFir
2f810 73 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d  st.   && pParse-
2f820 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c  >iRangeReg <= iL
2f830 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65  ast.  ){.     re
2f840 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
2f850 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
2f860 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b  >nTempReg; i++){
2f870 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
2f880 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46  >aTempReg[i]>=iF
2f890 69 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e  irst && pParse->
2f8a0 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61  aTempReg[i]<=iLa
2f8b0 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
2f8c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
2f8d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2f8e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2f8f0 45 42 55 47 20 2a 2f 0a                          EBUG */.