/ Hex Artifact Content
Login

Artifact 03f583cf773c10ec64b8b82b2f8326501c38c4ad12deda884c6efda9bb925b7c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  f;.        pNew-
66b0: 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c  >u.iValue = iVal
66c0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
66d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66e0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
66f0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
6700: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
6710: 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65  n->z!=0 || pToke
6720: 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  n->n==0 );.     
6730: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
6740: 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e   ) memcpy(pNew->
6750: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
6760: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
6770: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
6780: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
6790: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
67a0: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 73  if( dequote && s
67b0: 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e  qlite3Isquote(pN
67c0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29  ew->u.zToken[0])
67d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
67e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
67f0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
6800: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6810: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
6820: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
6830: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6840: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6850: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6860: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6870: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6880: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6890: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
68a0: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
68b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
68c0: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
68d0: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
68e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
68f0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6900: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6910: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6920: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6930: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6950: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6970: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6980: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6990: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
69a0: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
69b0: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
69d0: 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  30(zToken);.  re
69e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
69f0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
6a00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
6a10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
6a20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
6a30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
6a40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
6a50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
6a60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
6a70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6a80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
6a90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
6aa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
6ab0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6ac0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
6ad0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
6ae0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
6af0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
6b00: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
6b10: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
6b20: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
6b30: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
6b40: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6b70: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
6b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6b90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6ba0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6bb0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
6bc0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
6bd0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6bf0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6c00: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
6c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6c20: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
6c30: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
6c40: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
6c50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6c60: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
6c70: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6c80: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6c90: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
6ca0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6cb0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
6cc0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
6cd0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
6ce0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
6cf0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
6d00: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
6d10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d20: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
6d30: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
6d40: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
6d50: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
6d60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6d70: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
6d80: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
6d90: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
6da0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
6db0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6dd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6de0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6e00: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6e10: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
6e20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
6e30: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
6e40: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
6e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
6e60: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29  ght operand */.)
6e70: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
6e80: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
6e90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
6ea0: 20 26 26 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f   && !IN_RENAME_O
6eb0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 2f 2a 20  BJECT ){.    /* 
6ec0: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6ed0: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6ee0: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6ef0: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f10: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f20: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6f30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6f40: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6f50: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6f60: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6f70: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6f80: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
6f90: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fa0: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
6fb0: 70 20 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20  p & 0xff;.      
6fc0: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
6fd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
6fe0: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
6ff0: 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c  s(pParse->db, p,
7000: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
7010: 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b  .  }.  if( p ) {
7020: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7030: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
7040: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
7050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53  .}../*.** Add pS
7070: 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70  elect to the Exp
7080: 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c  r.x.pSelect fiel
7090: 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72  d.  Or, if pExpr
70a0: 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a   is NULL (due.**
70b0: 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   do a memory all
70c0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29  ocation failure)
70d0: 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
70e0: 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e   pSelect object.
70f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7100: 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50  PExprAddSelect(P
7110: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7120: 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63  pr *pExpr, Selec
7130: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69  t *pSelect){.  i
7140: 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
7150: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
7160: 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20   = pSelect;.    
7170: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
7180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
7190: 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29  ect|EP_Subquery)
71a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
71b0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
71c0: 67 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  gs(pParse, pExpr
71d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
71e0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
71f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7200: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
7210: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
7220: 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29  se->db, pSelect)
7230: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
7240: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
7250: 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  n is always eith
7260: 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45  er TRUE or FALSE
7270: 20 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c   (respectively),
7280: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
7290: 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f  1.  If one canno
72a0: 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  t determine the 
72b0: 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74  truth value of t
72c0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
72d0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
72e0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
72f0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
7300: 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73  mization.  If is
7310: 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20   OK to return 0 
7320: 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20  here even if.** 
7330: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
7340: 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20  eally is always 
7350: 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28  false or false (
7360: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
7370: 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20  )..** But it is 
7380: 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20  a bug to return 
7390: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
73a0: 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64  ion might have d
73b0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c  ifferent.** bool
73c0: 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69  ean values in di
73d0: 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74  fferent circumst
73e0: 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70  ances (a false p
73f0: 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20  ositive.).**.** 
7400: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65  Note that if the
7410: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70   expression is p
7420: 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e  art of condition
7430: 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54  al for a.** LEFT
7440: 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63   JOIN, then we c
7450: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
7460: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7470: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
7480: 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20  * is it true or 
7490: 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73  false, so always
74a0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
74b0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
74c0: 61 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29  aysTrue(Expr *p)
74d0: 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  {.  int v = 0;. 
74e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
74f0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
7500: 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
7510: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
7520: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20  xprIsInteger(p, 
7530: 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  &v) ) return 0;.
7540: 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d    return v!=0;.}
7550: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7560: 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72  AlwaysFalse(Expr
7570: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
7580: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
7590: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
75a0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
75b0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
75c0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
75d0: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
75e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d   0;.  return v==
75f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  0;.}../*.** Join
7600: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
7610: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
7620: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
7630: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
7640: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
7650: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
7660: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
7670: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69  .**.** If one si
7680: 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  de or the other 
7690: 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e  of the AND is kn
76a0: 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c  own to be false,
76b0: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a   then instead.**
76c0: 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e   of returning an
76d0: 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c   AND expression,
76e0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63   just return a c
76f0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
7700: 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c  on with.** a val
7710: 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ue of false..*/.
7720: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7730: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
7740: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
7750: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
7760: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
7770: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
7780: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
7790: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
77a0: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
77b0: 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
77c0: 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29  waysFalse(pLeft)
77d0: 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61   || exprAlwaysFa
77e0: 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20  lse(pRight) ){. 
77f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7800: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
7810: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7820: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
7830: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t);.    return s
7840: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7850: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
7860: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
7870: 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  s[0], 0);.  }els
7880: 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  e{.    Expr *pNe
7890: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
78a0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c  lloc(db, TK_AND,
78b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
78c0: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
78d0: 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20  trees(db, pNew, 
78e0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
78f0: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b      return pNew;
7900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
7910: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
7920: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
7930: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
7940: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
7950: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
7960: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
7970: 63 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ction(.  Parse *
7980: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
7990: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
79a0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
79b0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pList,      /* 
79c0: 41 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  Argument list */
79d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  .  Token *pToken
79e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
79f0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
7a00: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69   */.  int eDisti
7a10: 6e 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  nct         /* S
7a20: 46 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46  F_Distinct or SF
7a30: 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a  _ALL or 0 */.){.
7a40: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7a50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7a60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7a70: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7a80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7a90: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7aa0: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
7ab0: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
7ac0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7ad0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7ae0: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
7af0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
7b00: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
7b10: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
7b20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
7b30: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45  ist && pList->nE
7b40: 78 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62  xpr > pParse->db
7b50: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7b60: 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
7b70: 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  RG] ){.    sqlit
7b80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7b90: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67  e, "too many arg
7ba0: 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69  uments on functi
7bb0: 6f 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b  on %T", pToken);
7bc0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70  .  }.  pNew->x.p
7bd0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
7be0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
7bf0: 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63  pNew, EP_HasFunc
7c00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  );.  assert( !Ex
7c10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
7c20: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
7c30: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
7c40: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
7c50: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
7c60: 29 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e  );.  if( eDistin
7c70: 63 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ct==SF_Distinct 
7c80: 29 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74  ) ExprSetPropert
7c90: 79 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69  y(pNew, EP_Disti
7ca0: 6e 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  nct);.  return p
7cb0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
7cc0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
7cd0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
7ce0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
7cf0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
7d00: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7d10: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7d20: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7d30: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
7d40: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
7d50: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7d60: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
7d70: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
7d80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
7d90: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7da0: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
7db0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
7dc0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
7dd0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
7de0: 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61  not too big to a
7df0: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
7e00: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
7e10: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
7e20: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
7e30: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
7e40: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
7e50: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
7e60: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
7e70: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
7e80: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7e90: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
7ea0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
7eb0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
7ec0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
7ed0: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
7ee0: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
7ef0: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
7f00: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
7f10: 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65  uential variable
7f20: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
7f30: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
7f40: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
7f50: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
7f60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7f70: 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20  pExpr, u32 n){. 
7f80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7f90: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e  Parse->db;.  con
7fa0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e  st char *z;.  yn
7fb0: 56 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45  Var x;..  if( pE
7fc0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
7fd0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7fe0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7ff0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
8000: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
8010: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
8020: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
8030: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
8040: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
8050: 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  0]!=0 );.  asser
8060: 74 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74  t( n==(u32)sqlit
8070: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b  e3Strlen30(z) );
8080: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
8090: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
80a0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
80b0: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
80c0: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
80d0: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
80e0: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
80f0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28      x = (ynVar)(
8100: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
8110: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
8120: 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20  t doAdd = 0;.   
8130: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
8140: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8150: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
8160: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
8170: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
8180: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
8190: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
81a0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
81b0: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
81c0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20        int bOk;. 
81d0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
81e0: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
81f0: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
8200: 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20    i = z[1]-'0'; 
8210: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
8220: 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20  ase of ?N for a 
8230: 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a  single digit N *
8240: 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  /.        bOk = 
8250: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
8260: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d          bOk = 0=
8270: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
8280: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
8290: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
82a0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
82b0: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
82c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
82d0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
82e0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
82f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8300: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8310: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
8320: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
8330: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8340: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8350: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
8360: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
8370: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
8380: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8390: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
83a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
83b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
83c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
83d0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
83e0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
83f0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
8400: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8410: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8420: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8430: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8440: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
8450: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8460: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
8470: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
8480: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
8490: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
84a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
84b0: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
84c0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
84d0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
84e0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
84f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8500: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8510: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8520: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8530: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8540: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8550: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8560: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8570: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8580: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8590: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
85a0: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
85b0: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
85c0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
85d0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
85e0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
85f0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
8600: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
8610: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8620: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8630: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8640: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8650: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8660: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8670: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8680: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8690: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
86a0: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
86b0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
86c0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
86d0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
86e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
86f0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
8700: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8710: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8730: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8740: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8750: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8760: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8770: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8780: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8790: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
87a0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
87b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
87c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
87d0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
87e0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
87f0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
8800: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8810: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8820: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8830: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8840: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8850: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8860: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8870: 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
8880: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8890: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
88a0: 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 21 3d 30 20  || p->y.pWin!=0 
88b0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
88c0: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
88d0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54   p->op!=TK_FUNCT
88e0: 49 4f 4e 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ION || ExprHasPr
88f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
8900: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
8910: 64 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d).          || 
8920: 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c 7c 20  p->y.pWin==0 || 
8930: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8940: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  p, EP_WinFunc) )
8950: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8960: 44 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72  DEBUG.  if( Expr
8970: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8980: 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72  P_Leaf) && !Expr
8990: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
89a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
89b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
89c0: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Left==0 );.    a
89d0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
89e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
89f0: 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d  t( p->x.pSelect=
8a00: 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  =0 );.  }.#endif
8a10: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8a20: 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54  roperty(p, (EP_T
8a30: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
8a40: 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  )) ){.    /* The
8a50: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
8a60: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
8a70: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
8a80: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
8a90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
8aa0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
8ab0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
8ac0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
8ad0: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
8ae0: 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65  _COLUMN ) sqlite
8af0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8b00: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  , p->pLeft);.   
8b10: 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
8b20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8b30: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8b40: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
8b50: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
8b60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8b70: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
8b80: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8b90: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8ba0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8bc0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8bd0: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
8be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8bf0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8c00: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  (p, EP_WinFunc) 
8c10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8c20: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
8c30: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ION );.      sql
8c40: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
8c50: 28 64 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b  (db, p->y.pWin);
8c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8c70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8c80: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8c90: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8ca0: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8cb0: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
8cc0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8cd0: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
8ce0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
8cf0: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
8d00: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8d10: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8d20: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
8d30: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
8d40: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
8d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8d60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8d70: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
8d80: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
8d90: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
8da0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8db0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
8dc0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
8dd0: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
8de0: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
8df0: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
8e00: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
8e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
8e20: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8e30: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
8e40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8e50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
8e60: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
8e70: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
8e80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8e90: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
8ea0: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
8eb0: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
8ec0: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
8ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
8ee0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
8ef0: 65 6e 74 20 6f 66 20 61 6e 20 45 78 70 72 20 6e  ent of an Expr n
8f00: 6f 64 65 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  ode, taking care
8f10: 20 6e 6f 74 20 74 6f 20 72 65 61 64 0a 2a 2a 20   not to read.** 
8f20: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
8f30: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  the structure fo
8f40: 72 20 61 20 72 65 64 75 63 65 64 2d 73 69 7a 65  r a reduced-size
8f50: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
8f60: 73 6f 75 72 63 65 0a 2a 2a 20 45 78 70 72 2e 0a  source.** Expr..
8f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
8f80: 78 70 72 4e 6f 64 65 43 6f 70 79 28 45 78 70 72  xprNodeCopy(Expr
8f90: 20 2a 70 44 65 73 74 2c 20 45 78 70 72 20 2a 70   *pDest, Expr *p
8fa0: 53 72 63 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  Src){.  memset(p
8fb0: 44 65 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Dest, 0, sizeof(
8fc0: 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79  Expr));.  memcpy
8fd0: 28 70 44 65 73 74 2c 20 70 53 72 63 2c 20 65 78  (pDest, pSrc, ex
8fe0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 53 72  prStructSize(pSr
8ff0: 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  c));.}../*.** Th
9000: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
9010: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
9020: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
9030: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
9040: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
9050: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
9060: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
9070: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
9080: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
9090: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
90a0: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
90b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
90c0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
90d0: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
90e0: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
90f0: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
9100: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9110: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
9120: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
9130: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
9140: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
9150: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
9160: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
9170: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
9180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
91d0: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
91e0: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
91f0: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
9200: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
9210: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
9220: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
9230: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
9240: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
9250: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
9260: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
9270: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
9280: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
9290: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
92a0: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
92b0: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
92c0: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
92d0: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
92e0: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
92f0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
9300: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
9310: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
9320: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9330: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
9340: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
9350: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
9360: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9370: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
9380: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
9390: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
93a0: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
93b0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
93c0: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
93d0: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
93e0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
93f0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
9400: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
9410: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
9420: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
9430: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
9440: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
9450: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
9460: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
9470: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
9480: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
9490: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
94a0: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
94b0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
94c0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
94d0: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
94e0: 65 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  er parts of the 
94f0: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
9500: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
9510: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
9520: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
9530: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9540: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
9550: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
9560: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
9570: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
9580: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
9590: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
95a0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
95b0: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
95c0: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
95d0: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
95e0: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
95f0: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
9600: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
9610: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9620: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
9630: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
9640: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
9650: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
9660: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
9670: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
9680: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
9690: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
96a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
96b0: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
96c0: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
96d0: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
96e0: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
96f0: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
9700: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
9710: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
9720: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
9730: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
9740: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
9750: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
9760: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
9770: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
9780: 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e  ECT_COLUMN .#ifn
9790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
97a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c  WINDOWFUNC.   ||
97b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
97c0: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 0a  (p, EP_WinFunc).
97d0: 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
97e0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
97f0: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
9800: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9810: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9820: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
9830: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
9840: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9850: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
9860: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
9870: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9880: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9890: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
98a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
98b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
98c0: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
98d0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
98e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
98f0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9900: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
9910: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
9920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
9930: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9940: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
9950: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
9960: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
9970: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
9980: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
9990: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
99a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
99b0: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
99c0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
99d0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
99e0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
99f0: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
9a00: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
9a10: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
9a20: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
9a30: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
9a40: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9a50: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
9a60: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9a70: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
9a80: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9a90: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
9aa0: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
9ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9ac0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
9ad0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
9ae0: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
9af0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 4e 4e 28  lite3Strlen30NN(
9b00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
9b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
9b20: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
9b30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9b40: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9b50: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
9b60: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
9b70: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
9b80: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
9b90: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9ba0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
9bb0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
9bc0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
9bd0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
9be0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9bf0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
9c00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
9c10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
9c20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
9c30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
9c40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
9c50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
9c60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
9c70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
9c80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
9c90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
9ca0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
9cb0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
9cc0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
9cd0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
9ce0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
9cf0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
9d00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
9d10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
9d20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
9d30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
9d40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
9d50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
9d60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
9d70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
9d80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
9d90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
9da0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9db0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9dc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
9dd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
9de0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9df0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
9e00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
9e10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
9e20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
9e30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
9e40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
9e50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
9e60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
9e70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9e80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
9e90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
9ea0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9eb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9ec0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9ed0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9ee0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9ef0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9f00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9f10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9f20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9f30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9f40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9f50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9f60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9f70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9f80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
9f90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
9fa0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9fb0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9fc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9fd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9fe0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9ff0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
a000: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
a010: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
a020: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
a030: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
a040: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
a050: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
a060: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
a070: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
a080: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
a090: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
a0a0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
a0b0: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
a0c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
a0d0: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
a0e0: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
a0f0: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
a100: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
a110: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
a120: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
a130: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
a140: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
a150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
a160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
a170: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
a180: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
a190: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
a1a0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
a1b0: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a1c0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
a1d0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
a1e0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
a1f0: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
a200: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
a210: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
a220: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
a230: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
a240: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
a250: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
a260: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
a270: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
a280: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
a290: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
a2a0: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
a2b0: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
a2c0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
a2d0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
a2e0: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
a2f0: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
a300: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
a310: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
a320: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
a330: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
a340: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
a350: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
a360: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
a370: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
a380: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
a390: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a3a0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
a3b0: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
a3c0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
a3d0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
a3e0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
a3f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
a400: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
a410: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
a420: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a430: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
a440: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
a450: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
a460: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
a470: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a480: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
a490: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
a4a0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
a4b0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
a4c0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
a4d0: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
a4e0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a4f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
a500: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
a510: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a520: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a530: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
a540: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
a550: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
a560: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
a570: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
a580: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
a590: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
a5a0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
a5b0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
a5c0: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
a5d0: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
a5e0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
a5f0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
a600: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
a610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a620: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
a630: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
a640: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
a650: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
a660: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
a670: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a680: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
a690: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
a6a0: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
a6b0: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
a6c0: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
a6d0: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
a6e0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a6f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a700: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
a710: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
a720: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a730: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
a740: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
a750: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a760: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
a770: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
a780: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
a790: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
a7a0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a7b0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a7c0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a7d0: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a7e0: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a7f0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a800: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a810: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a820: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a830: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a840: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a850: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a860: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a880: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a890: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a8a0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a8b0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a8d0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a8e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a8f0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a900: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a910: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a920: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a930: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a940: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a950: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a960: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a970: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a980: 6e 6c 79 7c 45 50 5f 57 69 6e 46 75 6e 63 29 20  nly|EP_WinFunc) 
a990: 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  ){.      zAlloc 
a9a0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
a9b0: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
a9c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  );.      if( !Ex
a9d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
a9e0: 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ew, EP_TokenOnly
a9f0: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
aa00: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
aa10: 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20   = p->pLeft ?.  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
aa40: 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55  p->pLeft, EXPRDU
aa50: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
aa60: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  c) : 0;.        
aa70: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
aa80: 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20  ->pRight ?.     
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d    exprDup(db, p-
aab0: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
aac0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
aad0: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  ) : 0;.      }.#
aae0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aaf0: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
ab00: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
ab10: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
ab20: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
ab30: 20 20 70 4e 65 77 2d 3e 79 2e 70 57 69 6e 20 3d    pNew->y.pWin =
ab40: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
ab50: 70 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d 3e 79  p(db, pNew, p->y
ab60: 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  .pWin);.        
ab70: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
ab80: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
ab90: 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20  _WinFunc) );.   
aba0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
abb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
abc0: 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20 69  WFUNC */.      i
abd0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
abe0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
abf0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
ac00: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
ac10: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
ac20: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
ac30: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
ac40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
ac50: 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45   pNew->op==TK_SE
ac60: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  LECT_COLUMN ){. 
ac70: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
ac80: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  Left = p->pLeft;
ac90: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
aca0: 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  t( p->iColumn==0
acb0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
acc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
acd0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
ace0: 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  =0  || p->pRight
acf0: 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  ==p->pLeft );.  
ad00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ad10: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
ad20: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
ad30: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
ad40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
ad50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
ad60: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
ad70: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
ad80: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ght, 0);.      }
ad90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ada0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
adb0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65  ** Create and re
adc0: 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79  turn a deep copy
add0: 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70   of the object p
ade0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
adf0: 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ond .** argument
ae00: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64  . If an OOM cond
ae10: 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74  ition is encount
ae20: 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  ered, NULL is re
ae30: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68  turned.** and th
ae40: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
ae50: 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a  ed flag set..*/.
ae60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ae70: 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57  MIT_CTE.static W
ae80: 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c  ith *withDup(sql
ae90: 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
aea0: 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74  p){.  With *pRet
aeb0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
aec0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
aed0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69   sizeof(*p) + si
aee0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
aef0: 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20  (p->nCte-1);.   
af00: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   pRet = sqlite3D
af10: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
af20: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
af30: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  pRet ){.      in
af40: 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  t i;.      pRet-
af50: 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b  >nCte = p->nCte;
af60: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
af70: 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
af80: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
af90: 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  [i].pSelect = sq
afa0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
afb0: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  b, p->a[i].pSele
afc0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
afd0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  pRet->a[i].pCols
afe0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
aff0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  stDup(db, p->a[i
b000: 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20  ].pCols, 0);.   
b010: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
b020: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b030: 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61  bStrDup(db, p->a
b040: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
b050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b060: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
b070: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
b080: 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e  thDup(x,y) 0.#en
b090: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
b0a0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
b0b0: 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61  UNC./*.** The ga
b0c0: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b0d0: 73 28 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e  s() procedure an
b0e0: 64 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75  d its helper rou
b0f0: 74 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65  tine.** gatherSe
b100: 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62  lectWindowsCallb
b110: 61 63 6b 28 29 20 61 72 65 20 75 73 65 64 20 74  ack() are used t
b120: 6f 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65  o scan all the e
b130: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e  xpressions.** an
b140: 20 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61   a newly duplica
b150: 74 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  ted SELECT state
b160: 6d 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20  ment and gather 
b170: 61 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f  all of the Windo
b180: 77 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75  w.** objects fou
b190: 6e 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62  nd there, assemb
b1a0: 6c 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74  ling them onto t
b1b0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61  he linked list a
b1c0: 74 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a  t Select->pWin..
b1d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61  */.static int ga
b1e0: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b1f0: 73 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72  sCallback(Walker
b200: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
b210: 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
b220: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
b230: 43 54 49 4f 4e 20 26 26 20 70 45 78 70 72 2d 3e  CTION && pExpr->
b240: 79 2e 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20  y.pWin!=0 ){.   
b250: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
b260: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b270: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20  EP_WinFunc) );. 
b280: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e     pExpr->y.pWin
b290: 2d 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61  ->pNextWin = pWa
b2a0: 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d  lker->u.pSelect-
b2b0: 3e 70 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b  >pWin;.    pWalk
b2c0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70  er->u.pSelect->p
b2d0: 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70  Win = pExpr->y.p
b2e0: 57 69 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Win;.  }.  retur
b2f0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
b300: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  }.static int gat
b310: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b320: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57  SelectCallback(W
b330: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b340: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65  Select *p){.  re
b350: 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d  turn p==pWalker-
b360: 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43  >u.pSelect ? WRC
b370: 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f  _Continue : WRC_
b380: 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20  Prune;.}.static 
b390: 76 6f 69 64 20 67 61 74 68 65 72 53 65 6c 65 63  void gatherSelec
b3a0: 74 57 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20  tWindows(Select 
b3b0: 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
b3c0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
b3d0: 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63  ck = gatherSelec
b3e0: 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b  tWindowsCallback
b3f0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b400: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b410: 6c 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63  lectWindowsSelec
b420: 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78  tCallback;.  w.x
b430: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
b440: 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  = 0;.  w.pParse 
b450: 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65  = 0;.  w.u.pSele
b460: 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
b470: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
b480: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  p);.}.#endif.../
b490: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b4a0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
b4b0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
b4c0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
b4d0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
b4e0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
b4f0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
b500: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
b510: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
b520: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
b530: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
b540: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
b550: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
b560: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
b570: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
b580: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
b590: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b5a0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
b5b0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
b5c0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
b5d0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
b5e0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
b5f0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
b600: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
b610: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
b620: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
b630: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
b640: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
b650: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
b660: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
b670: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
b680: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
b690: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
b6a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
b6b0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
b6c0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
b6d0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
b6e0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
b6f0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
b700: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
b710: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
b720: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
b730: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
b740: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
b750: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
b760: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
b770: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
b780: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
b790: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
b7a0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
b7b0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
b7c0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
b7d0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b7e0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
b7f0: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
b800: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
b810: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
b820: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20  E );.  return p 
b830: 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  ? exprDup(db, p,
b840: 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a   flags, 0) : 0;.
b850: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
b860: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
b870: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
b880: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
b890: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
b8a0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
b8b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b8c0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
b8d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
b8e0: 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f   *pPriorSelectCo
b8f0: 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  l = 0;.  assert(
b900: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b910: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b920: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b930: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b940: 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  b, sqlite3DbMall
b950: 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a  ocSize(db, p));.
b960: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b970: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b980: 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78  ->nExpr = p->nEx
b990: 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e  pr;.  pItem = pN
b9a0: 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65  ew->a;.  pOldIte
b9b0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
b9c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
b9d0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
b9e0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
b9f0: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
ba00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
ba10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
ba20: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
ba30: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
ba40: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
ba50: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
ba60: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a    if( pOldExpr .
ba70: 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72       && pOldExpr
ba80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
ba90: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28  COLUMN.     && (
baa0: 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d  pNewExpr = pItem
bab0: 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20  ->pExpr)!=0 .   
bac0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bad0: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
bae0: 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b  umn==0 || i>0 );
baf0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45  .      if( pNewE
bb00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
bb10: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
bb20: 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65  t( pOldExpr->pLe
bb30: 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52  ft==pOldExpr->pR
bb40: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
bb50: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
bb60: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66  = pNewExpr->pLef
bb70: 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52  t = pNewExpr->pR
bb80: 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ight;.      }els
bb90: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
bba0: 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
bbb0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b    assert( pItem[
bbc0: 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  -1].pExpr!=0 );.
bbd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bbe0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
bbf0: 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  n==pItem[-1].pEx
bc00: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b  pr->iColumn+1 );
bc10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bc20: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
bc30: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
bc40: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
bc50: 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c      pNewExpr->pL
bc60: 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65  eft = pPriorSele
bc70: 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  ctCol;.      }. 
bc80: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e     }.    pItem->
bc90: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bca0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bcb0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bcc0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
bcd0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bce0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bcf0: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
bd00: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
bd10: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
bd20: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
bd30: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
bd40: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
bd50: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
bd60: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
bd70: 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f  >bSorterRef = pO
bd80: 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52  ldItem->bSorterR
bd90: 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ef;.    pItem->u
bda0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
bdb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
bdc0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
bdd0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
bde0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
bdf0: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
be00: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
be10: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
be20: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
be30: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
be40: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
be50: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
be60: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
be70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
be80: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
be90: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
bea0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
beb0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
bec0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
bed0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
bee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
bef0: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
bf00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
bf10: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
bf20: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
bf30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bf40: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
bf50: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
bf60: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
bf70: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
bf80: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
bf90: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
bfa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
bfb0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
bfc0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
bfd0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
bfe0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
bff0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
c000: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c010: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
c020: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
c030: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
c040: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
c050: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
c060: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
c070: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
c080: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
c090: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c0a0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c0b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
c0c0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
c0d0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
c0e0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
c0f0: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
c100: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
c110: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
c120: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
c130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c140: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
c150: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
c160: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
c170: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c180: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
c190: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
c1a0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
c1b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c1c0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
c1d0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c1e0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
c1f0: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
c200: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
c210: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
c220: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
c230: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
c240: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
c250: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c260: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
c270: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
c280: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
c290: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
c2a0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
c2b0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
c2c0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
c2d0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c2e0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
c2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
c300: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
c310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
c320: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
c330: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
c340: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
c350: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
c360: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
c370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c380: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c390: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
c3a0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
c3b0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
c3c0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
c3d0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
c3e0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
c3f0: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
c400: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
c410: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
c420: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
c430: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
c440: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
c450: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
c460: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c470: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
c480: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
c490: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
c4a0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
c4b0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c4c0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
c4d0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
c4e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
c4f0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
c500: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
c510: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
c520: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
c530: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
c540: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
c550: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
c560: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
c570: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c580: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c590: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c5a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
c5b0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
c5c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c5d0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
c5e0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
c5f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c600: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
c610: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
c620: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
c630: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c640: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
c650: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
c660: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
c670: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
c680: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
c690: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
c6a0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
c6b0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
c6c0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
c6d0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
c6e0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
c6f0: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
c700: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
c710: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
c720: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
c730: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
c740: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
c750: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
c760: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
c770: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
c780: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
c790: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
c7a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
c7b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
c7c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c7d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
c7e0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
c7f0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
c800: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
c810: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
c820: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
c830: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
c840: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
c850: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
c860: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
c870: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
c880: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
c890: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
c8a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
c8b0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
c8c0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
c8d0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
c8e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c8f0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c900: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c910: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c920: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c930: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c940: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c950: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c960: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c970: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c980: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c990: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c9a0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c9b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c9c0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c9d0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c9e0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c9f0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
ca00: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
ca10: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
ca20: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
ca30: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
ca40: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
ca50: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
ca60: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
ca70: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
ca80: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
ca90: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
caa0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
cab0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
cac0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
cad0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
cae0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
caf0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
cb00: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
cb10: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
cb20: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
cb30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
cb40: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
cb50: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
cb60: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
cb70: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
cb80: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
cb90: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
cba0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
cbb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
cbc0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
cbd0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
cbe0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
cbf0: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
cc00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cc10: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
cc20: 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d      pNew->pWin =
cc30: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57   0;.    pNew->pW
cc40: 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33  inDefn = sqlite3
cc50: 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62  WindowListDup(db
cc60: 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a  , p->pWinDefn);.
cc70: 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20      if( p->pWin 
cc80: 29 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  ) gatherSelectWi
cc90: 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e  ndows(pNew);.#en
cca0: 64 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65  dif.    pNew->se
ccb0: 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a  lId = p->selId;.
ccc0: 20 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a      *pp = pNew;.
ccd0: 20 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e      pp = &pNew->
cce0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78  pPrior;.    pNex
ccf0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
cd00: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
cd10: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
cd20: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
cd30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
cd40: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
cd50: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
cd60: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
cd70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cd80: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
cd90: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
cda0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
cdb0: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
cdc0: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
cdd0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
cde0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
cdf0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  on list..**.** T
ce00: 68 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e  he pList argumen
ce10: 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
ce20: 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74   NULL or a point
ce30: 65 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73  er to an ExprLis
ce40: 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  t.** obtained fr
ce50: 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  om a prior call 
ce60: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  to sqlite3ExprLi
ce70: 73 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69  stAppend().  Thi
ce80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79  s routine.** may
ce90: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
cea0: 68 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62  h an ExprList ob
ceb0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
cec0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
ced0: 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68  ..** Reason:  Th
cee0: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
cef0: 65 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  es that the numb
cf00: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70  er of slots in p
cf10: 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20  List->a[].** is 
cf20: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20  a power of two. 
cf30: 20 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f   That is true fo
cf40: 72 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  r sqlite3ExprLis
cf50: 74 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e  tAppend() return
cf60: 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20  s.** but is not 
cf70: 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
cf80: 20 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e   from the return
cf90: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
cfa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cfb0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
cfc0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
cfd0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
cfe0: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
cff0: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
d000: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
d010: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
d020: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
d030: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
d040: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
d050: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
d060: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
d070: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
d080: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d090: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d0a0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d0b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d0c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d0d0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
d0e0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
d0f0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
d100: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
d110: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
d120: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d130: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d140: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d150: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
d160: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
d170: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
d180: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d190: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
d1a0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
d1b0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
d1c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d1d0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
d1e0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
d1f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d200: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
d210: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
d220: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
d230: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
d240: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
d250: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
d260: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
d270: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65  t *pNew;.    pNe
d280: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
d290: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20  lloc(db, pList, 
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69  .             si
d2b0: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a  zeof(*pList)+(2*
d2c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31  pList->nExpr - 1
d2d0: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
d2e0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
d2f0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
d300: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
d310: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
d320: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65  pNew;.  }.  pIte
d330: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d340: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
d350: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
d360: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d370: 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73  t_item,zName)==s
d380: 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78  izeof(pItem->pEx
d390: 70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pr) );.  assert(
d3a0: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
d3b0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70   ExprList_item,p
d3c0: 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65  Expr)==0 );.  me
d3d0: 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61  mset(&pItem->zNa
d3e0: 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74  me,0,sizeof(*pIt
d3f0: 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72  em)-offsetof(str
d400: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d410: 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74  m,zName));.  pIt
d420: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
d430: 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  r;.  return pLis
d440: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
d450: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
d460: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
d470: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
d480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
d490: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
d4a0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
d4b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
d4c0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
d4d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f   0;.}../*.** pCo
d4e0: 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20  lumns and pExpr 
d4f0: 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73  form a vector as
d500: 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69  signment which i
d510: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 45  s part of the SE
d520: 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61  T.** clause of a
d530: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
d540: 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  nt.  Like this:.
d550: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c  **.**        (a,
d560: 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78  b,c) = (expr1,ex
d570: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72  pr2,expr3).** Or
d580: 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28  :    (a,b,c) = (
d590: 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f  SELECT x,y,z FRO
d5a0: 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f  M ....).**.** Fo
d5b0: 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  r each term of t
d5c0: 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e  he vector assign
d5d0: 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77  ment, append new
d5e0: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a   entries to the.
d5f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
d600: 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68  st pList.  In th
d610: 65 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 71  e case of a subq
d620: 75 65 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c  uery on the RHS,
d630: 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45   append.** TK_SE
d640: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  LECT_COLUMN expr
d650: 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72  essions..*/.Expr
d660: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
d670: 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f  rListAppendVecto
d680: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
d690: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
d6a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d6b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d6c0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
d6d0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d6e0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
d6f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74  NULL */.  IdList
d700: 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20   *pColumns,     
d710: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65   /* List of name
d720: 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20  s of LHS of the 
d730: 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20  assignment */.  
d740: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
d750: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
d760: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
d770: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
d780: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
d790: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d7a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
d7b0: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
d7c0: 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69  int iFirst = pLi
d7d0: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
d7e0: 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c  r : 0;.  /* pCol
d7f0: 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  umns can only be
d800: 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20   NULL due to an 
d810: 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77  OOM but an OOM w
d820: 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a  ill cause an.  *
d830: 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20  * exit prior to 
d840: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69  this routine bei
d850: 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  ng invoked */.  
d860: 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d  if( NEVER(pColum
d870: 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65  ns==0) ) goto ve
d880: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d890: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r;.  if( pExpr==
d8a0: 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f  0 ) goto vector_
d8b0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20  append_error;.. 
d8c0: 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 69   /* If the RHS i
d8d0: 73 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e  s a vector, then
d8e0: 20 77 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74   we can immediat
d8f0: 65 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ely check to see
d900: 20 74 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20   that .  ** the 
d910: 73 69 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20  size of the RHS 
d920: 61 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20  and LHS match.  
d930: 42 75 74 20 69 66 20 74 68 65 20 52 48 53 20 69  But if the RHS i
d940: 73 20 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a  s a SELECT, .  *
d950: 2a 20 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22  * wildcards ("*"
d960: 29 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ) in the result 
d970: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
d980: 54 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  T must be expand
d990: 65 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77  ed before.  ** w
d9a0: 65 20 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a  e can do the siz
d9b0: 65 20 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65  e check, so defe
d9c0: 72 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b  r the size check
d9d0: 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
d9e0: 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ration..  */.  i
d9f0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
da00: 5f 53 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75  _SELECT && pColu
da10: 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c  mns->nId!=(n=sql
da20: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
da30: 7a 65 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20  ze(pExpr)) ){.  
da40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
da50: 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f  g(pParse, "%d co
da60: 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25  lumns assigned %
da70: 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20  d values",.     
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
da90: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29  Columns->nId, n)
daa0: 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f  ;.    goto vecto
dab0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
dac0: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
dad0: 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  i<pColumns->nId;
dae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
daf0: 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69  *pSubExpr = sqli
db00: 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72  te3ExprForVector
db10: 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45  Field(pParse, pE
db20: 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69  xpr, i);.    pLi
db30: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
db40: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
db50: 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78  e, pList, pSubEx
db60: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  pr);.    if( pLi
db70: 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
db80: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
db90: 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a  ==iFirst+i+1 );.
dba0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70        pList->a[p
dbb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  List->nExpr-1].z
dbc0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  Name = pColumns-
dbd0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
dbe0: 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69     pColumns->a[i
dbf0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
dc00: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64   }.  }..  if( !d
dc10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dc20: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
dc30: 5f 53 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59  _SELECT && ALWAY
dc40: 53 28 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  S(pList!=0) ){. 
dc50: 20 20 20 45 78 70 72 20 2a 70 46 69 72 73 74 20     Expr *pFirst 
dc60: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  = pList->a[iFirs
dc70: 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  t].pExpr;.    as
dc80: 73 65 72 74 28 20 70 46 69 72 73 74 21 3d 30 20  sert( pFirst!=0 
dc90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
dca0: 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  First->op==TK_SE
dcb0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  LECT_COLUMN );. 
dcc0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72      .    /* Stor
dcd0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
dce0: 74 65 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74  tement in pRight
dcf0: 20 73 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64   so it will be d
dd00: 65 6c 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20  eleted when.    
dd10: 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  ** sqlite3ExprLi
dd20: 73 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61  stDelete() is ca
dd30: 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72  lled */.    pFir
dd40: 73 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78  st->pRight = pEx
dd50: 70 72 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  pr;.    pExpr = 
dd60: 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d  0;..    /* Remem
dd70: 62 65 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ber the size of 
dd80: 74 68 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c  the LHS in iTabl
dd90: 65 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  e so that we can
dda0: 20 63 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20   check that.    
ddb0: 2a 2a 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c  ** the RHS and L
ddc0: 48 53 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64  HS sizes match d
ddd0: 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72  uring code gener
dde0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46  ation. */.    pF
ddf0: 69 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70  irst->iTable = p
de00: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20  Columns->nId;.  
de10: 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  }..vector_append
de20: 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 49 4e  _error:.  if( IN
de30: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
de40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
de50: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61  ameExprUnmap(pPa
de60: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
de70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
de80: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
de90: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
dea0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
deb0: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
dec0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
ded0: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
dee0: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
def0: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
df00: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
df10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
df20: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
df30: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
df40: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a  nt iSortOrder){.
df50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
df60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53  urn;.  assert( S
df70: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
df80: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
df90: 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49  O_ASC>=0 && SQLI
dfa0: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
dfb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
dfc0: 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53  pr>0 );.  if( iS
dfd0: 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20  ortOrder<0 ){.  
dfe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70    assert( p->a[p
dff0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
e000: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
e010: 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ASC );.    retur
e020: 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d  n;.  }.  p->a[p-
e030: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
e040: 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f  der = (u8)iSortO
e050: 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rder;.}../*.** S
e060: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
e070: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
e080: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
e090: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
e0a0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
e0b0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
e0c0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
e0d0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
e0e0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
e0f0: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
e100: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
e110: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
e120: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
e130: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
e140: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
e150: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
e160: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e170: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
e180: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e190: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e1a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e1b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e1c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
e1d0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
e1e0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
e1f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
e200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
e210: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
e220: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
e230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e240: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
e250: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
e260: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e270: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
e280: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
e290: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
e2a0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
e2b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
e2c0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
e2d0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
e2e0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
e2f0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
e300: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
e310: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e320: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
e330: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
e340: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
e350: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
e360: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
e370: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
e380: 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44  quote ) sqlite3D
e390: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
e3a0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e  ame);.    if( IN
e3b0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
e3c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
e3d0: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
e3e0: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 49 74  arse, (void*)pIt
e3f0: 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  em->zName, pName
e400: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
e410: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
e420: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
e430: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
e440: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
e450: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
e460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e470: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
e480: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
e490: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
e4a0: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
e4b0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
e4c0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
e4d0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
e4e0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
e4f0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
e500: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
e510: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
e520: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
e530: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
e540: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
e550: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e560: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e570: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
e580: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
e590: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
e5a0: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
e5b0: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f  r *zStart,     /
e5c0: 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73  * Start of the s
e5d0: 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pan */.  const c
e5e0: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
e5f0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73   /* End of the s
e600: 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  pan */.){.  sqli
e610: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e620: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
e630: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
e640: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
e650: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
e660: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
e670: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e680: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
e690: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
e6a0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
e6b0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
e6c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e6d0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
e6e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
e6f0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70  an = sqlite3DbSp
e700: 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  anDup(db, zStart
e710: 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zEnd);.  }.}..
e720: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
e730: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
e740: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
e750: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
e760: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
e770: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
e780: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
e790: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e7a0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
e7b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e7c0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
e7d0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
e7e0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
e7f0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
e800: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
e810: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
e820: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
e830: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
e840: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
e850: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
e860: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
e870: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
e880: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e890: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
e8a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e8b0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
e8c0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
e8d0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
e8e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
e8f0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
e900: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
e910: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
e920: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
e930: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
e940: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
e950: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
e960: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
e970: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
e980: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
e990: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
e9a0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
e9b0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
e9c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
e9d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
e9e0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
e9f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ea00: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
ea10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ea20: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
ea30: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
ea40: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
ea50: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
ea60: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
ea70: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
ea80: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
ea90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
eaa0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
eab0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
eac0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
ead0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
eae0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
eaf0: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
eb00: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
eb10: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
eb20: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
eb30: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
eb40: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
eb50: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
eb60: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
eb70: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
eb80: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f  pList!=0 );.  fo
eb90: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
eba0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
ebb0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
ebc0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
ebd0: 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20  r;.     assert( 
ebe0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
ebf0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
ec00: 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  gs;.  }.  return
ec10: 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   m;.}../*.** Thi
ec20: 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f  s is a SELECT-no
ec30: 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
ec40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
ec50: 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c  alker that.** al
ec60: 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42  ways "fails".  B
ec70: 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73  y "fail" in this
ec80: 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73   case, we mean s
ec90: 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65  et.** pWalker->e
eca0: 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64  Code to zero and
ecb0: 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   abort..**.** Th
ecc0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75  is callback is u
ecd0: 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  sed by multiple 
ece0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
ecf0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
ed00: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
ed10: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
ed20: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
ed30: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
ed40: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
ed50: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
ed60: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
ed70: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a  WRC_Abort;.}../*
ed80: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
ed90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
eda0: 6e 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61  n ID with the na
edb0: 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61  me "true" or "fa
edc0: 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e  lse".** then con
edd0: 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20  vert it into an 
ede0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72  TK_TRUEFALSE ter
edf0: 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  m.  Return non-z
ee00: 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ero if.** the co
ee10: 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65  nversion happene
ee20: 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74  d, and zero if t
ee30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ee40: 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69   unaltered..*/.i
ee50: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  nt sqlite3ExprId
ee60: 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72  ToTrueFalse(Expr
ee70: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
ee80: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
ee90: 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_ID || pExpr->o
eea0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
eeb0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
eec0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
eed0: 5f 51 75 6f 74 65 64 29 0a 20 20 20 26 26 20 28  _Quoted).   && (
eee0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
eef0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
ef00: 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20  "true")==0.     
ef10: 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49    || sqlite3StrI
ef20: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
ef30: 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30  ken, "false")==0
ef40: 29 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72  ).  ){.    pExpr
ef50: 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46 41  ->op = TK_TRUEFA
ef60: 4c 53 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LSE;.    return 
ef70: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
ef80: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
ef90: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
efa0: 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20   a TK_TRUEFALSE 
efb0: 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75  Expr node.  Retu
efc0: 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52  rn 1 if it is TR
efd0: 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  UE.** and 0 if i
efe0: 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69  t is FALSE..*/.i
eff0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  nt sqlite3ExprTr
f000: 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45  uthValue(const E
f010: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
f020: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f030: 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29  ==TK_TRUEFALSE )
f040: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f050: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
f060: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65  ->u.zToken,"true
f070: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ")==0.       || 
f080: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
f090: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
f0a0: 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20  false")==0 );.  
f0b0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e  return pExpr->u.
f0c0: 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a  zToken[4]==0;.}.
f0d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
f0e0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
f0f0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64  r callbacks used
f100: 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73   to check expres
f110: 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20  sions to.** see 
f120: 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e  if they are "con
f130: 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20  stant" for some 
f140: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f  definition of co
f150: 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20  nstant.  The.** 
f160: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
f170: 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ue determines th
f180: 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74  e type of "const
f190: 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b  ant" we are look
f1a0: 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a  ing.** for..**.*
f1b0: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
f1c0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
f1d0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
f1e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
f1f0: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
f200: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f230: 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==1.**     sqlit
f240: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f250: 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20  NotJoin()       
f260: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f270: 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c  de==2.**     sql
f280: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
f290: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
f2a0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
f2b0: 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73  Code==3.**     s
f2c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f2d0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
f2e0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f2f0: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a  >eCode==4 or 5.*
f300: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
f310: 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  s, the callbacks
f320: 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64   set Walker.eCod
f330: 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66  e=0 and abort if
f340: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
f350: 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e  ** is found to n
f360: 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ot be a constant
f370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
f380: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f390: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73  tOrFunction() is
f3a0: 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61   used for evalua
f3b0: 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  ting expressions
f3c0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
f3d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
f3e0: 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f    The Walker.eCo
f3f0: 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68  de value is 5 wh
f400: 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e  en parsing.** an
f410: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f420: 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63   and 4 when proc
f430: 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61  essing a new sta
f440: 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64  tement.  A bound
f450: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61  .** parameter ra
f460: 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  ises an error fo
f470: 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73  r new statements
f480: 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c  , but is silentl
f490: 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  y converted.** t
f4a0: 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74  o NULL for exist
f4b0: 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ing schemas.  Th
f4c0: 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65  is allows sqlite
f4d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74  _master tables t
f4e0: 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  hat .** contain 
f4f0: 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  a bound paramete
f500: 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77  r because they w
f510: 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ere generated by
f520: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a   older versions.
f530: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20  ** of SQLite to 
f540: 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77  be parsed by new
f550: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
f560: 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61  QLite without ra
f570: 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f  ising a.** malfo
f580: 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f  rmed schema erro
f590: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f5a0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f5b0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
f5c0: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
f5d0: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
f5e0: 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20  ker->eCode is 2 
f5f0: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
f600: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f610: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
f620: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
f630: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
f640: 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71  a left join disq
f650: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
f660: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
f670: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
f680: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
f690: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
f6a0: 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48  Code==2 && ExprH
f6b0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f6c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
f6d0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
f6e0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
f6f0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f700: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
f710: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
f720: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
f730: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
f740: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
f750: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
f760: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
f770: 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b  and either pWalk
f780: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
f790: 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f  5 or the functio
f7a0: 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  n has the.    **
f7b0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
f7c0: 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20  ST flag. */.    
f7d0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
f7e0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
f7f0: 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c  ker->eCode>=4 ||
f800: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f810: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
f820: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
f830: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f840: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
f850: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
f860: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f880: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
f890: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
f8a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
f8b0: 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73   "true" or "fals
f8c0: 65 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54 20  e" in a DEFAULT 
f8d0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65 0a  clause into the.
f8e0: 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70 72        ** appropr
f8f0: 69 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  iate TK_TRUEFALS
f900: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
f910: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f920: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
f930: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
f940: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
f950: 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
f960: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
f970: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
f980: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
f990: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
f9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
f9b0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
f9c0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f9d0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
f9e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f9f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
fa00: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
fa10: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fa20: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
fa30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fa40: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fa50: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
fa60: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
fa70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
fa80: 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 26 26 20  EP_FixedCol) && 
fa90: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d  pWalker->eCode!=
faa0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2 ){.        ret
fab0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
fac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fad0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
fae0: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
faf0: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
fb00: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
fb10: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fb20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fb30: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
fb40: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
fb50: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
fb60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
fb70: 47 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65  GISTER:.      te
fb80: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fb90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
fba0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fbb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fbc0: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
fbd0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
fbe0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
fbf0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fc00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
fc10: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
fc20: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
fc30: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
fc40: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
fc50: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
fc60: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
fc70: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
fc80: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
fc90: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
fca0: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
fcb0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
fcc0: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
fcd0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
fce0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
fcf0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
fd00: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
fd10: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
fd20: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
fd30: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
fd40: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
fd50: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
fd60: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
fd70: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
fd80: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
fd90: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
fda0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
fdb0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
fdc0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
fdd0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fde0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
fdf0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
fe00: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
fe10: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
fe20: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fe30: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
fe40: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
fe50: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
fe60: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
fe70: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fe80: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
fe90: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
fea0: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
feb0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
fec0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
fed0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
fee0: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
fef0: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
ff00: 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  g, int iCur){.  
ff10: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
ff20: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
ff30: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
ff40: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
ff50: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
ff60: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
ff70: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
ff80: 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
ff90: 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
ffa0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
ffb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
ffc0: 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
ffd0: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
ffe0: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
fff0: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10000 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
10010 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
10020 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10030 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
10040 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
10050 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10060 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
10070 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
10080 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
10090 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
100a0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
100b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
100c0 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
100d0 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
100e0 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
100f0 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
10100 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
10110 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
10120 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
10130 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
10140 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10150 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
10160 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
10170 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
10180 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
10190 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
101a0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
101b0 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74  if.**.**   (1) t
101c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
101d0 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a   constant, and.*
101e0 2a 20 20 20 28 32 29 20 74 68 65 20 65 78 70 72  *   (2) the expr
101f0 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67  ession does orig
10200 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 20  inate in the ON 
10210 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
10220 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
10230 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20  FT JOIN, and.** 
10240 20 20 28 33 29 20 74 68 65 20 65 78 70 72 65 73    (3) the expres
10250 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  sion does not co
10260 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f 46 69 78  ntain any EP_Fix
10270 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a  edCol TK_COLUMN.
10280 2a 2a 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64  **       operand
10290 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
102a0 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
102b0 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ation optimizati
102c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  on..**.** When t
102d0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
102e0 72 6e 73 20 74 72 75 65 2c 20 69 74 20 69 6e 64  rns true, it ind
102f0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
10300 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61  expression.** ca
10310 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  n be added to th
10320 65 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  e pParse->pConst
10330 45 78 70 72 20 6c 69 73 74 20 61 6e 64 20 65 76  Expr list and ev
10340 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 77 68 65  aluated once whe
10350 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70 61 72 65  n.** the prepare
10360 64 20 73 74 61 74 65 6d 65 6e 74 20 73 74 61 72  d statement star
10370 74 73 20 75 70 2e 20 20 53 65 65 20 73 71 6c 69  ts up.  See sqli
10380 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
10390 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  t()..*/.int sqli
103a0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
103b0 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
103c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
103d0 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
103e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
103f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
10400 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
10410 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
10420 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
10430 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
10440 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
10450 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
10460 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
10470 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
10480 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10490 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
104a0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
104b0 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
104c0 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
104d0 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
104e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
104f0 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
10500 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
10510 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
10520 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
10530 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cur);.}.../*.** 
10540 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
10550 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
10560 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  by sqlite3ExprIs
10570 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10580 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y()..*/.static i
10590 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
105a0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57  stantOrGroupBy(W
105b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
105c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
105d0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
105e0 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  By = pWalker->u.
105f0 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20  pGroupBy;.  int 
10600 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  i;..  /* Check i
10610 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74  f pExpr is ident
10620 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55  ical to any GROU
10630 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f  P BY term. If so
10640 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20  , consider.  ** 
10650 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f  it constant.  */
10660 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47  .  for(i=0; i<pG
10670 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
10680 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10690 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
106a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
106b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
106c0 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c  are(0, pExpr, p,
106d0 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20   -1)<2 ){.      
106e0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
106f0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
10700 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70  llSeq(pWalker->p
10710 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
10720 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69   if( sqlite3IsBi
10730 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20  nary(pColl) ){. 
10740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
10750 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
10760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10770 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
10780 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
10790 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
107a0 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f   it variable. */
107b0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
107c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
107d0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
107e0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
107f0 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
10800 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
10810 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e  ..  return exprN
10820 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57  odeIsConstant(pW
10830 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d  alker, pExpr);.}
10840 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65  ../*.** Walk the
10850 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10860 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10870 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
10880 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  eturn non-zero.*
10890 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
108a0 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ion consists ent
108b0 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
108c0 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  ts or copies of 
108d0 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72  terms .** in pGr
108e0 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20  oupBy that sort 
108f0 77 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20  with the BINARY 
10900 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10910 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
10920 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
10930 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
10940 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
10950 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a  ING clause can.*
10960 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e  * be promoted in
10970 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
10980 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66  use.  In order f
10990 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74  or such a promot
109a0 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20  ion to work,.** 
109b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
109c0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74   HAVING clause t
109d0 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20  erm must be the 
109e0 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d  same for all mem
109f0 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72  bers of.** a "gr
10a00 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69  oup".  The requi
10a10 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
10a20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75  GROUP BY term mu
10a30 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20  st be BINARY.** 
10a40 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20  assumes that no 
10a50 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20  other collating 
10a60 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61  sequence will ha
10a70 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e  ve a finer-grain
10a80 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74  ed.** grouping t
10a90 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20  han binary.  In 
10aa0 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42  other words (A=B
10ab0 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29   COLLATE binary)
10ac0 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20   implies.** A=B 
10ad0 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63  in every other c
10ae0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10af0 65 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  e.  The requirem
10b00 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ent that the.** 
10b10 47 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41  GROUP BY be BINA
10b20 52 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74  RY is stricter t
10b30 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20  han necessary.  
10b40 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f  It would also wo
10b50 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65  rk.** to promote
10b60 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
10b70 74 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d  that use the sam
10b80 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  e alternative co
10b90 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
10ba0 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50  nce as the GROUP
10bb0 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68   BY term, but th
10bc0 61 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65  at is much harde
10bd0 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61  r to check,.** a
10be0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10bf0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
10c00 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  re uncommon, and
10c10 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e   this is only an
10c20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
10c30 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65  , so we take the
10c40 20 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e   easy way out an
10c50 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65  d simply require
10c60 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
10c70 20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41   to use the BINA
10c80 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  RY collating seq
10c90 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uence..*/.int sq
10ca0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10cb0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72  antOrGroupBy(Par
10cc0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
10cd0 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
10ce0 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b  GroupBy){.  Walk
10cf0 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10d00 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
10d10 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
10d20 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
10d30 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63  upBy;.  w.xSelec
10d40 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
10d50 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20   w.u.pGroupBy = 
10d60 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50  pGroupBy;.  w.pP
10d70 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
10d80 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
10d90 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
10da0 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
10db0 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
10dc0 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
10dd0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
10de0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10df0 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
10e00 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
10e10 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
10e20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
10e30 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
10e40 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
10e50 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
10e60 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
10e70 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
10e80 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
10e90 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
10ea0 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
10eb0 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
10ec0 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
10ed0 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10ee0 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
10ef0 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
10f00 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10f10 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
10f20 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
10f30 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
10f40 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
10f50 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
10f60 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10f70 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
10f80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10f90 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
10fa0 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
10fb0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10fc0 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
10fd0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10fe0 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
10ff0 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
11000 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
11010 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
11020 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
11030 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
11040 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
11050 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
11060 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
11070 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
11080 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
11090 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  rWalkNoop;.  w.x
110a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
110b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
110c0 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
110d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
110e0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
110f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11100 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
11110 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  dif.  sqlite3Wal
11120 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
11130 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
11140 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
11150 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
11160 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
11170 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
11180 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
11190 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
111a0 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
111b0 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
111c0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
111d0 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
111e0 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
111f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11200 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
11210 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
11220 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
11230 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
11240 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
11250 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
11260 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
11270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11280 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
11290 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
112a0 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
112b0 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
112c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
112d0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  n only happen fo
112e0 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a  llowing on OOM *
112f0 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  /..  /* If an ex
11300 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
11310 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
11320 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
11330 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
11340 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
11350 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
11360 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
11370 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
11380 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
11390 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
113a0 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
113b0 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
113c0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
113d0 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
113e0 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
113f0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
11400 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
11410 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
11420 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
11430 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11440 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
11450 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11460 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
11470 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
11480 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
11490 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
114a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
114b0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
114c0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
114d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
114e0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
114f0 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
11500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11510 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
11520 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
11530 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
11540 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
11550 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11560 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
11570 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
11580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11590 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
115a0 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
115b0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
115c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
115d0 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
115e0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
115f0 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
11600 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
11610 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
11620 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
11630 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
11640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11650 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
11660 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
11670 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
11680 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
11690 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
116a0 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
116b0 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
116c0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
116d0 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
116e0 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
116f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
11700 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
11710 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
11720 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
11730 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
11740 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
11750 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
11760 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
11770 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
11780 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
11790 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
117a0 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
117b0 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
117c0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
117d0 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
117e0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
117f0 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
11800 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
11810 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
11820 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
11830 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11840 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11850 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20  TK_UMINUS ){.   
11860 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
11870 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
11880 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
11890 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
118a0 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
118b0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
118c0 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
118d0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
118e0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
118f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
11900 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
11910 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
11920 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65  COLUMN:.      re
11930 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
11940 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
11950 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
11960 20 20 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d        p->y.pTab=
11970 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65  =0 ||  /* Refere
11980 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66  nce to column of
11990 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
119a0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sion */.        
119b0 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
119c0 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62  >=0 && p->y.pTab
119d0 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
119e0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
119f0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
11a00 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11a20 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11a30 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
11a40 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
11a50 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
11a60 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
11a70 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
11a80 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
11a90 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
11aa0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
11ab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11ac0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
11ad0 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
11ae0 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
11af0 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
11b00 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
11b10 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
11b20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
11b30 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
11b40 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
11b50 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
11b60 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
11b70 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
11b80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11b90 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
11ba0 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
11bb0 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
11bc0 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
11bd0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11be0 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
11bf0 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
11c00 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
11c10 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11c20 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11c30 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
11c40 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
11c50 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
11c60 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
11c70 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
11c80 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
11c90 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11ca0 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11cb0 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11cc0 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11cd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
11ce0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
11cf0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11d00 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
11d10 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11d20 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
11d30 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
11d40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11d50 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
11d60 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
11d70 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
11d80 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11d90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11da0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11db0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
11dc0 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
11dd0 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
11de0 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
11df0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
11e00 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
11e10 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
11e20 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11e30 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11e40 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11e50 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
11e60 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
11e70 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11e80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11e90 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
11ea0 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
11eb0 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
11ec0 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
11ed0 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
11ee0 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
11ef0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11f00 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
11f10 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11f20 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11f30 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
11f40 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11f50 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11f60 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
11f70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
11f80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11f90 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
11fa0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
11fb0 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
11fc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
11fd0 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
11fe0 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
11ff0 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
12000 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
12010 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12020 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12030 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
12040 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
12050 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
12060 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12070 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
12080 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
12090 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
120a0 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
120b0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
120c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
120d0 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
120e0 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
120f0 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
12100 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
12110 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
12120 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
12130 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
12140 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
12150 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
12160 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
12170 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
12180 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
12190 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
121a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
121b0 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
121c0 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
121d0 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
121e0 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
121f0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
12200 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
12210 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12220 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
12230 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
12240 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
12250 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
12260 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
12270 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
12280 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12290 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
122a0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
122b0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
122c0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
122d0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
122e0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
122f0 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
12300 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
12310 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
12320 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
12330 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
12340 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
12350 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
12360 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
12370 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
12380 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
12390 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
123a0 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123c0 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
123d0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
123e0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
123f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12400 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
12410 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
12420 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
12430 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
12440 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
12450 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
12460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
12470 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
12480 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12490 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
124a0 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
124b0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
124c0 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
124d0 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
124e0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
124f0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
12500 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
12510 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
12520 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
12530 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
12540 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
12550 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
12560 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
12570 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
12580 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
12590 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
125a0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
125b0 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
125c0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
125d0 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
125e0 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
125f0 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
12600 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
12610 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
12620 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
12630 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
12640 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
12650 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
12660 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
12670 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
12680 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
12690 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
126a0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
126b0 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
126c0 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
126d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
126e0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
126f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12700 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
12710 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12720 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
12730 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
12740 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
12750 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
12760 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
12770 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
12780 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
12790 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
127a0 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
127b0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
127c0 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
127d0 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
127e0 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
127f0 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
12800 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
12810 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
12820 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
12830 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
12840 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
12850 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
12860 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
12870 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
12880 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
12890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
128b0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
128c0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
128d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
128e0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
128f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12900 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12910 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12920 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
12930 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
12940 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12950 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
12960 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
12970 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
12980 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
12990 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
129a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
129b0 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
129c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
129d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
129e0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
129f0 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
12a00 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
12a10 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
12a20 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
12a30 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
12a40 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
12a50 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
12a60 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12a70 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
12a80 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
12a90 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
12aa0 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
12ab0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
12ac0 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
12ad0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
12ae0 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
12af0 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
12b00 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
12b10 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
12b20 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
12b30 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
12b40 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
12b50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
12b60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12b70 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
12b80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12b90 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
12ba0 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
12bb0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
12bc0 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
12bd0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12be0 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
12bf0 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
12c00 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
12c10 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
12c20 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
12c30 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
12c40 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
12c50 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
12c60 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
12c70 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
12c80 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
12c90 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
12ca0 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
12cb0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
12cc0 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
12cd0 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
12ce0 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
12cf0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
12d00 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
12d10 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
12d20 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
12d30 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12d40 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
12d50 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
12d60 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12d70 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
12d80 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
12d90 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
12da0 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
12db0 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
12dc0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12dd0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
12de0 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
12df0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12e00 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
12e10 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12e20 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
12e30 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12e40 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
12e50 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
12e60 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
12e70 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
12e80 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12e90 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
12ea0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
12eb0 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
12ec0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12ed0 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
12ee0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
12ef0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12f00 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
12f10 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
12f20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12f30 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
12f40 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
12f50 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
12f60 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
12f70 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12f90 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
12fa0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
12fb0 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
12fc0 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
12fd0 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
12fe0 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
12ff0 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
13000 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
13010 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
13020 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
13030 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
13040 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
13050 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
13060 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13070 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
13080 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
13090 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
130a0 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
130b0 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
130c0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
130d0 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
130e0 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
130f0 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
13100 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
13110 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
13120 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
13130 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
13140 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
13150 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
13160 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d  in, at a minimum
13170 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  , one of the bit
13180 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
13190 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
131a0 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f  NDEX_LOOP but no
131b0 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c  t both.  If inFl
131c0 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
131d0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
131e0 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
131f0 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
13200 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
13210 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73   fast.** members
13220 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
13230 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
13240 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
13250 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a  e IN index will.
13260 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ** be used to lo
13270 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
13280 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
13290 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
132a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
132b0 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
132c0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
132d0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
132e0 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
132f0 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
13300 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
13310 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
13320 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
13330 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
13340 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  mal table will b
13350 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73  e created unless
13360 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
13370 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
13380 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
13390 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
133a0 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
133b0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
133c0 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
133d0 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
133e0 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
133f0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
13400 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
13410 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
13420 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
13430 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
13440 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
13450 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
13460 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
13470 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
13480 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
13490 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
134a0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
134b0 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
134c0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
134d0 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
134e0 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
134f0 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
13500 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
13510 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
13520 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
13530 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
13540 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
13550 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13560 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13570 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
13580 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
13590 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
135a0 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
135b0 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
135c0 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
135d0 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
135e0 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
135f0 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
13600 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
13610 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
13620 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
13630 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
13640 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
13650 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
13660 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
13670 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
13680 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
13690 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
136a0 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
136b0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
136c0 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
136d0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
136e0 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
136f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13700 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
13710 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13720 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
13730 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
13740 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
13750 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
13760 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
13770 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
13780 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
13790 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
137a0 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
137b0 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
137c0 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
137d0 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
137e0 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
137f0 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
13800 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
13810 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
13820 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
13830 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
13840 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
13850 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
13860 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
13870 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
13880 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
13890 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
138a0 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
138b0 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
138c0 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
138d0 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
138e0 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
138f0 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
13900 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
13910 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
13920 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
13930 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
13940 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13950 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
13960 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
13970 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
13980 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
13990 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
139a0 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
139b0 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
139c0 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
139d0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
139e0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
139f0 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
13a00 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
13a10 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
13a20 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
13a30 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
13a40 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
13a50 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
13a60 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
13a70 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
13a80 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
13a90 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
13aa0 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
13ab0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
13ac0 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
13ad0 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
13ae0 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
13af0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
13b00 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
13b10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
13b20 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
13b30 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
13b40 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13b50 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
13b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b70 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
13b80 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
13b90 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
13ba0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13bb0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13bc0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
13bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13be0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13bf0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
13c00 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13c10 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
13c20 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13c30 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
13c40 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
13c50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
13c60 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
13c70 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
13c80 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13c90 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
13ca0 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
13cb0 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 2c 20 20  .  int *aiMap,  
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13cd0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
13ce0 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
13cf0 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 69 6e  S fields */.  in
13d00 74 20 2a 70 69 54 61 62 20 20 20 20 20 20 20 20  t *piTab        
13d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13d20 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f   index to use */
13d30 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  .){.  Select *p;
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13d60 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
13d70 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
13d80 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
13d90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13db0 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
13dc0 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
13dd0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
13de0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
13df0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
13e00 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
13e10 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
13e20 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e40 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
13e50 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
13e60 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13e70 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13e80 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
13e90 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
13ea0 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
13eb0 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
13ec0 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
13ed0 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
13ee0 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
13ef0 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  !=0;..  /* If th
13f00 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e  e RHS of this IN
13f10 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69  (...) operator i
13f20 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  s a SELECT, and 
13f30 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20  if it matters . 
13f40 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
13f50 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ot the SELECT re
13f60 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  sult contains NU
13f70 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b  LL values, check
13f80 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
13f90 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74   not NULL is act
13fa0 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28  ually possible (
13fb0 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66  it may not be, f
13fc0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20  or example, due 
13fd0 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c  .  ** to NOT NUL
13fe0 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  L constraints in
13ff0 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66   the schema). If
14000 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
14010 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20  are possible,.  
14020 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e  ** set prRhsHasN
14030 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20  ull to 0 before 
14040 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a  continuing.  */.
14050 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
14060 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73  ll && (pX->flags
14070 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
14080 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
14090 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
140a0 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c  ist = pX->x.pSel
140b0 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
140c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
140d0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
140e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
140f0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
14100 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
14110 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pr) ) break;.   
14120 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45   }.    if( i==pE
14130 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
14140 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c       prRhsHasNul
14150 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
14160 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
14170 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
14180 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
14190 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
141a0 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
141b0 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
141c0 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
141d0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
141e0 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
141f0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66   table.  */.  if
14200 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
14210 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64  0 && (p = isCand
14220 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58  idateForInOpt(pX
14230 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
14240 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
14250 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
14260 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14270 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14280 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
142b0 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
142c0 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
142f0 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
14300 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  b */.    ExprLis
14310 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
14320 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e  EList;.    int n
14330 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
14340 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
14350 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
14360 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
14370 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14380 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14390 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
143a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
143b0 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
143c0 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
143d0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
143e0 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
143f0 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14410 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
14420 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
14430 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
14440 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
14450 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
14460 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
14470 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
14480 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
14490 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
144a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
144b0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
144c0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
144d0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
144e0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
144f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
14500 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
14510 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
14520 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
14530 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  ;..    assert(v)
14540 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ;  /* sqlite3Get
14550 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79  Vdbe() has alway
14560 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
14570 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  y called */.    
14580 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
14590 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
145a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
145b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  .      /* The "x
145c0 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
145d0 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63  d FROM table)" c
145e0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ase */.      int
145f0 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
14600 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14610 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64  _Once);.      Vd
14620 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
14630 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
14640 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
14650 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
14660 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
14670 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
14680 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
14690 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
146a0 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  an((pParse, 0,. 
146b0 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
146c0 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20 4f  G ROWID SEARCH O
146d0 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20 49  N TABLE %s FOR I
146e0 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61 62  N-OPERATOR",pTab
146f0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
14700 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14710 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
14720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14730 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14760 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
14770 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
14780 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
14790 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
147a0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
147b0 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
147c0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
147d0 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
147e0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
147f0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14800 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
14810 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
14820 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
14830 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
14840 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
14850 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
14860 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
14870 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
14880 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
14890 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
148a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
148b0 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
148c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
148d0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
148e0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
148f0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14900 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
14910 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
14920 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
14930 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
14940 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
14950 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14960 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
14970 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
14980 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
14990 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
149a0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
149b0 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
149c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
149d0 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
149e0 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
149f0 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14a00 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14a10 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14a20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
14a30 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
14a40 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
14a50 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
14a60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
14a70 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
14a80 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
14a90 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
14aa0 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
14ab0 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
14ac0 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
14ad0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14ae0 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14af0 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14b00 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14b10 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
14b20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
14b30 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
14b40 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
14b50 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
14b60 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
14b70 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
14b80 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
14b90 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
14ba0 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
14bb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
14bc0 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
14bd0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14bf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14c00 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14c10 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
14c20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
14c30 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
14c40 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
14c50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14c60 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
14c70 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
14c80 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
14c90 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
14ca0 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
14cb0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
14cc0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
14cd0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14ce0 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14cf0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14d10 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
14d20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14d30 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
14d40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
14d50 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
14d60 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
14d70 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
14d80 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
14d90 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
14da0 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
14db0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14dc0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
14dd0 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74 69 6e  here!=0 ) contin
14de0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
14df0 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
14e00 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
14e10 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
14e20 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
14e30 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
14e40 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
14e50 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
14e60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
14e70 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
14e80 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
14e90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ea0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14eb0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
14ec0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14ed0 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
14ee0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
14ef0 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
14f00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14f10 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
14f20 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
14f30 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
14f40 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
14f50 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
14f60 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
14f70 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
14f80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
14f90 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
14fa0 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
14fb0 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
14fc0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
14fd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
14fe0 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
14ff0 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
15000 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
15010 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
15020 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15030 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
15040 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
15050 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
15060 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
15070 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
15080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
15090 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
150a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
150b0 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
150c0 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
150d0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
150e0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
150f0 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
15100 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
15110 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
15120 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
15130 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
15140 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
15150 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
15160 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
15170 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15190 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
151a0 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
151b0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
151d0 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
151e0 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
151f0 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
15200 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
15210 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
15220 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
15230 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
15240 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15260 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
15270 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15290 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
152a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
152b0 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
152c0 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
152d0 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
152e0 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
152f0 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
15300 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
15310 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
15320 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
15330 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
15340 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
15350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15360 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15370 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
15380 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
15390 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
153a0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
153b0 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
153c0 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
153d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
153e0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
153f0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
15400 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
15410 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
15420 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
15430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15440 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
15450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15460 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
15470 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
15480 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49          "USING I
154b0 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
154c0 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
154d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
154e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
154f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
15500 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
15510 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
15520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15530 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
15540 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
15550 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
15560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
15570 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
15580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
15590 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
155a0 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
155b0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
155c0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
155d0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
155e0 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
155f0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
15600 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
15610 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
15620 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
15630 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
15640 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
15650 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
15660 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
15670 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
15680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15690 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
156a0 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
156c0 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
156d0 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
156e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
156f0 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
15700 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
15710 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
15720 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
15730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15740 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
15750 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
15760 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
15770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15780 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
15790 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
157a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
157b0 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
157c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
157d0 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
157e0 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
157f0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
15800 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
15810 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
15820 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
15830 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
15840 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
15850 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
15860 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
15870 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
15880 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
15890 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
158a0 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
158b0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
158c0 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
158d0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
158e0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
158f0 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
15900 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
15910 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
15920 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
15930 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
15940 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
15950 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
15960 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
15970 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
15980 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
15990 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
159a0 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
159b0 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
159c0 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
159d0 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
159e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
159f0 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
15a00 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
15a10 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
15a20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
15a30 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
15a40 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
15a50 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
15a60 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15a70 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
15a80 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
15a90 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
15aa0 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
15ab0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15ac0 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
15ad0 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
15ae0 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
15af0 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
15b00 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
15b10 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
15b20 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
15b30 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
15b40 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
15b50 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
15b60 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
15b70 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
15b80 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
15b90 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
15ba0 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
15bb0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15bc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15bd0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15be0 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
15bf0 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
15c00 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
15c10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
15c20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
15c30 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 73  ==TK_IN );.    s
15c40 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49  qlite3CodeRhsOfI
15c50 4e 28 70 50 61 72 73 65 2c 20 70 58 2c 20 69 54  N(pParse, pX, iT
15c60 61 62 29 3b 0a 20 20 20 20 69 66 28 20 72 4d 61  ab);.    if( rMa
15c70 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
15c80 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
15c90 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
15ca0 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
15cb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
15cc0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
15cd0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
15ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
15cf0 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
15d00 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
15d10 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15d20 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
15d30 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
15d40 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
15d50 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
15d60 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
15d70 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
15d80 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
15d90 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54 61 62  .  *piTab = iTab
15da0 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  ;.  return eType
15db0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
15dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15dd0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15de0 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15df0 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15e00 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15e10 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
15e20 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
15e30 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
15e40 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
15e50 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
15e60 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
15e70 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
15e80 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
15e90 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
15ea0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
15eb0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15ec0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
15ed0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
15ee0 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
15ef0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
15f00 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
15f10 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
15f20 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
15f30 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
15f40 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
15f50 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
15f60 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
15f70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
15f80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
15f90 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
15fa0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
15fb0 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
15fc0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
15fd0 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
15fe0 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
15ff0 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
16000 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
16010 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
16020 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16030 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
16040 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
16050 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
16060 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16070 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
16080 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
16090 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
160a0 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
160b0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
160c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
160d0 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
160e0 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
160f0 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16100 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
16110 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
16120 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
16130 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
16140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
16150 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
16160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
16170 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
16180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
16190 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
161a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
161b0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
161c0 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
161d0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
161e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
161f0 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
16200 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
16210 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
16220 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
16230 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
16240 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
16250 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
16260 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
16270 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16280 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
16290 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
162a0 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
162b0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
162c0 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
162d0 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
162e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
162f0 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
16300 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
16310 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16320 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
16330 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
16340 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
16350 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
16360 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
16370 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
16380 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
16390 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
163a0 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
163b0 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
163c0 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
163d0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
163e0 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
163f0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16400 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16410 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
16420 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
16430 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
16440 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
16450 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
16460 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
16470 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
16480 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16490 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
164a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
164b0 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
164c0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
164d0 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
164e0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
164f0 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
16500 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
16510 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
16520 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
16530 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
16540 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16550 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
16560 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
16570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16580 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
16590 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
165a0 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74   that will const
165b0 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65 72 61  ruct an ephemera
165c0 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  l table containi
165d0 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20  ng all terms.** 
165e0 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  in the RHS of an
165f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54   IN operator.  T
16600 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 63  he IN operator c
16610 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65 72 20  an be in either 
16620 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  of two.** forms:
16630 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  .**.**     x IN 
16640 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
16650 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
16660 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
16670 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
16680 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
16690 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
166a0 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
166b0 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
166c0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
166d0 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
166e0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 49  rameter is the I
166f0 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65  N operator.  The
16700 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
16710 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72  or the.** constr
16720 75 63 74 65 64 20 65 70 68 65 72 6d 65 72 61 6c  ucted ephermeral
16730 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
16740 65 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  ed.  The first t
16750 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65 72 61  ime the ephemera
16760 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 63 6f  l.** table is co
16770 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75 72 73  mputed, the curs
16780 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 73  or number is als
16790 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  o stored in pExp
167a0 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f  r->iTable,.** ho
167b0 77 65 76 65 72 20 74 68 65 20 63 75 72 73 6f 72  wever the cursor
167c0 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
167d0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 68   might not be th
167e0 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20 6d 69  e same, as it mi
167f0 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ght.** have been
16800 20 64 75 70 6c 69 63 61 74 65 64 20 75 73 69 6e   duplicated usin
16810 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a  g OP_OpenDup..**
16820 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53 20 65  .** If the LHS e
16830 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22 20 69  xpression ("x" i
16840 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73 29 20  n the examples) 
16850 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
16860 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c  e, or.** the SEL
16870 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
16880 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
16890 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
168a0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
168b0 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
168c0 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
168d0 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
168e0 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 2a  th 'x' and the.*
168f0 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
16900 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16910 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
16920 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
16930 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f  .** if either co
16940 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
16950 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
16960 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
16970 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20  .** 'x' nor the 
16980 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
16990 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
169a0 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
169b0 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75 73 65  finity.** is use
169c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
169d0 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20  e3CodeRhsOfIN(. 
169e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
169f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
16a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16a10 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
16a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16a30 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
16a40 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20   int iTab       
16a50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
16a60 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  this cursor numb
16a70 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
16a80 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20  ddrOnce = 0;    
16a90 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16aa0 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 6e 63 65  s of the OP_Once
16ab0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
16ac0 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  top */.  int add
16ad0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
16ae0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16af0 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
16b00 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
16b10 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
16b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16b30 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74   /* the LHS of t
16b40 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
16b50 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16b60 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
16b70 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
16b80 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  on */.  int nVal
16b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ba0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
16bb0 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
16bc0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16be0 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
16bf0 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
16c00 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
16c10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16c20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
16c30 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  0 );..  /* The e
16c40 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
16c50 20 49 4e 20 6d 75 73 74 20 62 65 20 72 65 70 65   IN must be repe
16c60 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  ated every time 
16c70 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  it.  ** is encou
16c80 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66  ntered if any of
16c90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
16ca0 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
16cb0 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
16cc0 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
16cd0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
16ce0 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
16cf0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
16d00 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
16d10 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
16d20 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
16d30 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
16d40 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
16d50 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
16d60 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
16d70 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
16d80 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  we can compute t
16d90 68 65 20 52 48 53 20 6a 75 73 74 20 6f 6e 63 65  he RHS just once
16da0 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75 73 65 20  .  ** and reuse 
16db0 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73 2e 0a 20  it many names.. 
16dc0 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
16dd0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16de0 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
16df0 26 26 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  && pParse->iSelf
16e00 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Tab==0 ){.    /*
16e10 20 52 65 75 73 65 20 6f 66 20 74 68 65 20 52 48   Reuse of the RH
16e20 53 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  S is allowed */.
16e30 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72      /* If this r
16e40 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61  outine has alrea
16e50 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20 62  dy been coded, b
16e60 75 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ut the previous 
16e70 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68  code.    ** migh
16e80 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
16e90 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20 73 6f 20  invoked yet, so 
16ea0 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 20 61 73  invoke it now as
16eb0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 0a   a subroutine. .
16ec0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 45      */.    if( E
16ed0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16ee0 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
16ef0 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
16f00 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
16f10 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
16f20 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16f30 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  (v);.      if( E
16f40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16f50 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16f60 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ct) ){.        E
16f70 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
16f80 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52 45 55  (pParse, 0, "REU
16f90 53 45 20 4c 49 53 54 20 53 55 42 51 55 45 52 59  SE LIST SUBQUERY
16fa0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
16fb0 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65      pExpr->x.pSe
16fc0 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  lect->selId));. 
16fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16ff0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70  , OP_Gosub, pExp
17000 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
17010 72 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn,.            
17020 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
17030 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b  r->y.sub.iAddr);
17040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17060 70 65 6e 44 75 70 2c 20 69 54 61 62 2c 20 70 45  penDup, iTab, pE
17070 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
17080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
17090 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
170a0 6e 63 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nce);.      retu
170b0 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
170c0 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74  * Begin coding t
170d0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  he subroutine */
170e0 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
170f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
17100 75 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70  ubrtn);.    pExp
17110 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
17120 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
17130 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
17140 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20  y.sub.iAddr =.  
17150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17160 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
17170 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79  ger, 0, pExpr->y
17180 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20  .sub.regReturn) 
17190 2b 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  + 1;.    VdbeCom
171a0 6d 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e  ment((v, "return
171b0 20 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20   address"));..  
171c0 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
171d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
171e0 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
171f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
17200 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
17210 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
17220 20 76 65 63 74 6f 72 20 49 4e 20 6f 70 65 72 61   vector IN opera
17230 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74 20 3d  tor */.  pLeft =
17240 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
17250 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
17260 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
17270 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  eft);..  /* Cons
17280 74 72 75 63 74 20 74 68 65 20 65 70 68 65 6d 65  truct the epheme
17290 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 77  ral table that w
172a0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
172b0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  content of.  ** 
172c0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
172d0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70  erator..  */.  p
172e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
172f0 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  Tab;.  addr = sq
17300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17310 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
17320 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
17330 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69 66 64 65  le, nVal);.#ifde
17340 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17350 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
17360 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
17370 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17380 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17390 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
173a0 76 2c 20 22 52 65 73 75 6c 74 20 6f 66 20 53 45  v, "Result of SE
173b0 4c 45 43 54 20 25 75 22 2c 20 70 45 78 70 72 2d  LECT %u", pExpr-
173c0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
173d0 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d));.  }else{.  
173e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
173f0 2c 20 22 52 48 53 20 6f 66 20 49 4e 20 6f 70 65  , "RHS of IN ope
17400 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d 0a 23 65  rator"));.  }.#e
17410 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e 66 6f 20  ndif.  pKeyInfo 
17420 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
17430 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
17440 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 69  , nVal, 1);..  i
17450 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
17460 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
17470 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f  Select) ){.    /
17480 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
17490 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
174a0 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
174b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
174c0 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
174d0 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
174e0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
174f0 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
17500 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
17510 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
17520 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20    */.    Select 
17530 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
17540 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
17550 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
17560 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
17570 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c 61 69  ist;..    Explai
17580 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
17590 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53  se, 1, "%sLIST S
175a0 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
175b0 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f 22 22       addrOnce?""
175c0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 20  :"CORRELATED ", 
175d0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 0a 20  pSelect->selId. 
175e0 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66     ));.    /* If
175f0 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53   the LHS and RHS
17600 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
17610 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  tor do not match
17620 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 72  , that.    ** er
17630 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
17640 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
17650 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
17660 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
17670 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
17680 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
17690 29 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  ) ){.      Selec
176a0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
176b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
176c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
176d0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
176e0 53 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20 20  Set, iTab);.    
176f0 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20    dest.zAffSdst 
17700 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
17710 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
17720 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  .      pSelect->
17730 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
17740 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
17750 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
17760 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
17770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17780 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
17790 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
177a0 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
177b0 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
177c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
177d0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
177e0 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
177f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17800 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
17810 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
17820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
17830 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
17840 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  Info);.        r
17850 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
17860 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17870 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17880 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
178a0 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
178b0 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
178c0 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
178d0 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
178e0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
178f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
17900 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
17910 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  pr>0 );.      as
17920 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
17930 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
17940 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
17950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
17960 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
17970 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17980 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17990 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
179a0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
179b0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
179c0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
179d0 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
179e0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
179f0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
17a00 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
17a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17a20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
17a30 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
17a40 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  =0) ){.    /* Ca
17a50 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
17a60 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
17a70 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65   **.    ** For e
17a80 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
17a90 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
17aa0 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
17ab0 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a  uation and.    *
17ac0 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
17ad0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17ae0 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
17af0 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
17b00 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  se.    ** that c
17b10 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
17b20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
17b30 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
17b40 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  pr> is not.    *
17b50 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
17b60 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
17b80 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
17b90 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
17ba0 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
17bb0 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69   the IN */.    i
17bc0 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
17bd0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17be0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17bf0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17c00 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
17c10 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
17c20 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20  .    affinity = 
17c30 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
17c40 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
17c50 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
17c60 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
17c70 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17c80 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  B;.    }.    if(
17c90 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
17ca0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
17cb0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
17cc0 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
17cd0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
17ce0 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17cf0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17d00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17d10 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Left);.    }..  
17d20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
17d30 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
17d40 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
17d50 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
17d60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17d70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
17d80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17d90 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17da0 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17db0 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17dc0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17dd0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  tem++){.      Ex
17de0 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
17df0 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 2f  >pExpr;..      /
17e00 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17e10 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
17e20 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
17e30 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   need to.      *
17e40 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
17e50 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
17e60 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
17e70 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
17e80 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
17e90 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
17ea0 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
17eb0 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
17ec0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
17ed0 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
17ee0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
17ef0 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a  ch time..      *
17f00 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  /.      if( addr
17f10 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65 33  Once && !sqlite3
17f20 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
17f30 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  E2) ){.        s
17f40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17f50 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e  ToNoop(v, addrOn
17f60 63 65 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  ce);.        add
17f70 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  rOnce = 0;.     
17f80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
17f90 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
17fa0 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
17fb0 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
17fc0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
17fd0 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
17fe0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17ff0 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
18000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18010 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
18020 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
18030 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
18040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18050 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
18060 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
18070 62 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20  b, r2, r3, 1);. 
18080 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18090 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
180a0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
180b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
180c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
180d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
180e0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 73 71 6c  yInfo ){.    sql
180f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
18100 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
18110 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
18120 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20 69  EYINFO);.  }.  i
18130 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20  f( addrOnce ){. 
18140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
18150 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
18160 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53 75 62 72  ce);.    /* Subr
18170 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f  outine return */
18180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18190 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
181a0 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  urn, pExpr->y.su
181b0 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  b.regReturn);.  
181c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
181d0 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e  ngeP1(v, pExpr->
181e0 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73  y.sub.iAddr-1, s
181f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18200 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d  tAddr(v)-1);.  }
18210 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18220 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18230 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  Y */../*.** Gene
18240 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
18250 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
18260 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
18270 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ry expression.**
18280 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
18290 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  tor:.**.**     (
182a0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
182b0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
182c0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
182d0 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
182e0 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
182f0 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a  S subquery.**.**
18300 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
18310 65 74 65 72 20 69 73 20 74 68 65 20 53 45 4c 45  eter is the SELE
18320 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
18330 72 61 74 6f 72 20 74 6f 20 62 65 20 63 6f 64 65  rator to be code
18340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67  d..**.** The reg
18350 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
18360 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 46 6f   the result.  Fo
18370 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
18380 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65   SELECT, .** the
18390 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
183a0 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
183b0 73 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  s array of regis
183c0 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ters and the.** 
183d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
183e0 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
183f0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65  the left-most re
18400 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  sult column..** 
18410 52 65 74 75 72 6e 20 30 20 69 66 20 61 6e 20 65  Return 0 if an e
18420 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
18430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18440 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
18450 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
18460 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
18470 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18480 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  ){.  int addrOnc
18490 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
184a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
184b0 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20 6f 66  P_Once at top of
184c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
184d0 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20   int rReg = 0;  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
184f0 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
18500 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
18510 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
18520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18530 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18540 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53  to encode */.  S
18550 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
18560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
18570 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
18580 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
18590 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185b0 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   Registers to al
185c0 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78 70 72  locate */.  Expr
185d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20   *pLimit;       
185e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
185f0 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
18600 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  */..  Vdbe *v = 
18610 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18620 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
18630 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
18640 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
18650 53 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  S );.  testcase(
18660 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18670 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72  ELECT );.  asser
18680 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
18690 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
186a0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
186b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 78 70  );.  assert( Exp
186c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
186d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
186e0 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45  ) );.  pSel = pE
186f0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
18700 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
18710 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 49 53  tion of the EXIS
18720 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
18730 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
18740 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
18750 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
18760 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
18770 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
18780 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
18790 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
187a0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
187b0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
187c0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
187d0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
187e0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
187f0 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
18800 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
18810 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
18820 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
18830 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
18840 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
18850 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
18860 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
18870 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
18880 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
18890 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
188a0 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
188b0 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
188c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
188d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
188e0 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
188f0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
18900 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
18910 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
18920 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
18930 69 74 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 73  it as a.    ** s
18940 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  ubroutine. */.  
18950 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
18960 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18970 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20  Subrtn) ){.     
18980 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
18990 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52  n((pParse, 0, "R
189a0 45 55 53 45 20 53 55 42 51 55 45 52 59 20 25 64  EUSE SUBQUERY %d
189b0 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29  ", pSel->selId))
189c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
189d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
189e0 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e  Gosub, pExpr->y.
189f0 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20  sub.regReturn,. 
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e         pExpr->y.
18a20 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20  sub.iAddr);.    
18a30 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
18a40 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20  iTable;.    }.. 
18a50 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69     /* Begin codi
18a60 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
18a70 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74  e */.    ExprSet
18a80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18a90 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20  EP_Subrtn);.    
18aa0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18ab0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
18ac0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78  e->nMem;.    pEx
18ad0 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20  pr->y.sub.iAddr 
18ae0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
18af0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18b00 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70  Integer, 0, pExp
18b10 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
18b20 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62  rn) + 1;.    Vdb
18b30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
18b40 74 75 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b  turn address"));
18b50 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d  ..    addrOnce =
18b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18b70 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
18b80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18b90 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  .  }.  .  /* For
18ba0 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72   a SELECT, gener
18bb0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
18bc0 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  the values for a
18bd0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  ll columns of.  
18be0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  ** the first row
18bf0 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
18c00 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
18c10 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  return the index
18c20 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   of.  ** the fir
18c30 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a  st register..  *
18c40 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
18c50 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
18c60 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  te an integer 0 
18c70 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
18c80 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a 2a 20  1 (exists).  ** 
18c90 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
18ca0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20  and return that 
18cb0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e  register number.
18cc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f  .  **.  ** In bo
18cd0 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
18ce0 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
18cf0 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
18d00 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65    Any .  ** pree
18d10 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73  xisting limit is
18d20 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c   discarded in pl
18d30 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c  ace of the new L
18d40 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45  IMIT 1..  */.  E
18d50 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18d60 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53  (pParse, 1, "%sS
18d70 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20 25  CALAR SUBQUERY %
18d80 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72  d",.        addr
18d90 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41  Once?"":"CORRELA
18da0 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  TED ", pSel->sel
18db0 49 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70  Id));.  nReg = p
18dc0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18dd0 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
18de0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
18df0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18e00 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
18e10 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29   pParse->nMem+1)
18e20 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
18e30 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28 20   += nReg;.  if( 
18e40 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
18e50 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65 73 74  LECT ){.    dest
18e60 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
18e70 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73 74  ;.    dest.iSdst
18e80 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
18e90 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20  .    dest.nSdst 
18ea0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c 69  = nReg;.    sqli
18eb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18ec0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
18ed0 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
18ee0 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
18ef0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
18f00 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
18f10 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
18f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
18f30 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
18f40 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sts;.    sqlite3
18f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18f60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
18f70 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
18f80 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18f90 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
18fa0 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c  ult"));.  }.  pL
18fb0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
18fc0 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
18fd0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26  db, TK_INTEGER,&
18fe0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
18ff0 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [1], 0);.  if( p
19000 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sel->pLimit ){. 
19010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
19020 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
19030 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
19040 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d  Left);.    pSel-
19050 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d  >pLimit->pLeft =
19060 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65   pLimit;.  }else
19070 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d  {.    pSel->pLim
19080 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
19090 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d  r(pParse, TK_LIM
190a0 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a  IT, pLimit, 0);.
190b0 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d    }.  pSel->iLim
190c0 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  it = 0;.  if( sq
190d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
190e0 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
190f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19100 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  ;.  }.  pExpr->i
19110 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d 20 64  Table = rReg = d
19120 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45  est.iSDParm;.  E
19130 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
19140 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
19150 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61 64 64  duce);.  if( add
19160 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  rOnce ){.    sql
19170 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19180 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a  (v, addrOnce);..
19190 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
191a0 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  e return */.    
191b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
191c0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
191d0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
191e0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c  Return);.    sql
191f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
19200 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  (v, pExpr->y.sub
19210 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65  .iAddr-1, sqlite
19220 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19230 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72  (v)-1);.  }..  r
19240 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
19250 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
19260 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
19270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19280 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
19290 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20  .** Expr pIn is 
192a0 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  an IN(...) expre
192b0 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ssion. This func
192c0 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74  tion checks that
192d0 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
192e0 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ect on the RHS o
192f0 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61  f the IN() opera
19300 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65  tor has the same
19310 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63   number of .** c
19320 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65  olumns as the ve
19330 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
19340 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20   Or, if the RHS 
19350 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e  of the IN() is n
19360 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65  ot .** a sub-que
19370 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53  ry, that the LHS
19380 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20   is a vector of 
19390 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  size 1..*/.int s
193a0 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
193b0 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  N(Parse *pParse,
193c0 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69   Expr *pIn){.  i
193d0 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  nt nVector = sql
193e0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
193f0 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  ze(pIn->pLeft);.
19400 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67    if( (pIn->flag
19410 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
19420 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65  ) ){.    if( nVe
19430 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65  ctor!=pIn->x.pSe
19440 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
19450 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
19460 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
19470 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  or(pParse, pIn->
19480 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
19490 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f  t->nExpr, nVecto
194a0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
194b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
194c0 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31  e if( nVector!=1
194d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
194e0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50  ectorErrorMsg(pP
194f0 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74  arse, pIn->pLeft
19500 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
19510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19520 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
19530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19540 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
19550 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
19560 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
19570 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
19580 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
19590 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
195a0 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
195b0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
195c0 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
195d0 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65  s a scalar or ve
195e0 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ctor expression.
195f0 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d    The .** right-
19600 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
19610 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
19620 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c  ero or more scal
19630 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a  ar values, or a.
19640 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66  ** subquery.  If
19650 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75   the RHS is a su
19660 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62  bquery, the numb
19670 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19680 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74  umns must.** mat
19690 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
196a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
196b0 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
196c0 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  S.  If the RHS i
196d0 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76  s.** a list of v
196e0 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d  alues, the LHS m
196f0 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e  ust be a scalar.
19700 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f   .**.** The IN o
19710 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20  perator is true 
19720 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  if the LHS value
19730 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
19740 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  thin the RHS..**
19750 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   The result is f
19760 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
19770 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f  is definitely no
19780 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  t in the RHS.  T
19790 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  he .** result is
197a0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65   NULL if the pre
197b0 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53  sence of the LHS
197c0 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e   in the RHS cann
197d0 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d  ot be .** determ
197e0 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c  ined due to NULL
197f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
19800 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
19810 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
19820 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
19830 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
19840 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
19850 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
19860 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
19870 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
19880 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
19890 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
198a0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
198b0 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
198c0 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
198d0 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
198e0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
198f0 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
19900 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
19910 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61  eparate in-opera
19920 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61  tor.md documenta
19930 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65  tion file in the
19940 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51   canonical.** SQ
19950 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65  Lite source tree
19960 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
19970 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
19980 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
19990 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
199a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
199b0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
199c0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
199d0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
199e0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
199f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19a00 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
19a10 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
19a20 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
19a30 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
19a40 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
19a50 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
19a60 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
19a70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19a80 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
19a90 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
19aa0 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
19ab0 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
19ac0 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
19ad0 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
19ae0 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
19af0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
19b00 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
19b10 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
19b20 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
19b30 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20  nt rLhs;        
19b40 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
19b50 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  (s) holding the 
19b60 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  LHS values */.  
19b70 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20  int rLhsOrig;   
19b80 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c        /* LHS val
19b90 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f  ues prior to reo
19ba0 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70  rdering by aiMap
19bb0 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  [] */.  Vdbe *v;
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19bd0 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
19be0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
19bf0 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
19c00 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
19c10 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
19c20 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
19c30 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
19c40 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
19c50 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
19c60 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
19c70 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
19c80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
19c90 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
19ca0 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
19cb0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d  or */.  int iDum
19cc0 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  my;           /*
19cd0 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72   Dummy parameter
19ce0 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74   to exprCodeVect
19cf0 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a  or() */.  Expr *
19d00 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
19d10 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
19d20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
19d30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19d40 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
19d50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
19d60 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20  t destStep2;    
19d70 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
19d80 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20  jump when NULLs 
19d90 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a  seen in step 2 *
19da0 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
19db0 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61  6 = 0;    /* Sta
19dc0 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53  rt of code for S
19dd0 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
19de0 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20  ddrTruthOp;     
19df0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f   /* Address of o
19e00 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72  pcode that deter
19e10 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20  mines the IN is 
19e20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  true */.  int de
19e30 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20  stNotNull;      
19e40 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19e50 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  a comparison is 
19e60 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70  not true in step
19e70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
19e80 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
19e90 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70   Top of the step
19ea0 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e  -6 loop */ .  in
19eb0 74 20 69 54 61 62 20 3d 20 30 3b 20 20 20 20 20  t iTab = 0;     
19ec0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
19ed0 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20  use */..  pLeft 
19ee0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
19ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19f00 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c  rCheckIN(pParse,
19f10 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
19f20 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49  ;.  zAff = exprI
19f30 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
19f40 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63  , pExpr);.  nVec
19f50 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
19f60 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
19f70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
19f80 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
19f90 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
19fa0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
19fb0 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
19fc0 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
19fd0 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
19fe0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19ff0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a000 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
1a010 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1a020 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  r;..  /* Attempt
1a030 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
1a040 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
1a050 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
1a060 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
1a070 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
1a080 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1a090 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 77 69   table opened wi
1a0a0 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 0a 20  th cursor iTab. 
1a0b0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
1a0c0 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
1a0d0 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66  e up the RHS. If
1a0e0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
1a0f0 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
1a100 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74   the RHS has not
1a110 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e   yet been coded.
1a120 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
1a130 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1a140 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1a150 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
1a160 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
1a170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
1a180 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a190 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
1a1a0 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
1a1b0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
1a1c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
1a1f0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
1a200 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
1a210 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
1a240 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
1a250 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20  &rRhsHasNull,.  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 20 20 20 20 20 20 20 20 61 69 4d 61 70             aiMap
1a280 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20 61 73 73  , &iTab);..  ass
1a290 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1a2a0 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20  r || nVector==1 
1a2b0 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
1a2c0 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c  EX_EPH.       ||
1a2d0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a2e0 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54  _INDEX_ASC || eT
1a2f0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a300 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23  DEX_DESC .  );.#
1a310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a320 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20  UG.  /* Confirm 
1a330 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e  that aiMap[] con
1a340 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e  tains nVector in
1a350 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74  teger values bet
1a360 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20  ween 0 and.  ** 
1a370 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20  nVector-1. */.  
1a380 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a390 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  or; i++){.    in
1a3a0 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f  t j, cnt;.    fo
1a3b0 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65  r(cnt=j=0; j<nVe
1a3c0 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61  ctor; j++) if( a
1a3d0 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74  iMap[j]==i ) cnt
1a3e0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
1a3f0 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65  cnt==1 );.  }.#e
1a400 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  ndif..  /* Code 
1a410 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
1a420 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
1a430 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
1a440 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
1a450 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
1a460 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
1a470 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
1a480 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
1a490 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
1a4a0 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c  1..  **.  ** sql
1a4b0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a4c0 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f  ) might have reo
1a4d0 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64  rdered the field
1a4e0 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63  s of the LHS vec
1a4f0 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  tor.  ** so that
1a500 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20   the fields are 
1a510 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
1a520 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67  r as an existing
1a530 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20   index.   The.  
1a540 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79  ** aiMap[] array
1a550 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70   contains a mapp
1a560 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69  ing from the ori
1a570 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20  ginal LHS field 
1a580 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  order to.  ** th
1a590 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68  e field order th
1a5a0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52  at matches the R
1a5b0 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  HS index..  */. 
1a5c0 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72   rLhsOrig = expr
1a5d0 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
1a5e0 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
1a5f0 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
1a600 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61  <nVector && aiMa
1a610 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20  p[i]==i; i++){} 
1a620 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64  /* Are LHS field
1a630 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a  s reordered? */.
1a640 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72    if( i==nVector
1a650 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66   ){.    /* LHS f
1a660 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65  ields are not re
1a670 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72  ordered */.    r
1a680 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a  Lhs = rLhsOrig;.
1a690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1a6a0 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20  Need to reorder 
1a6b0 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61  the LHS fields a
1a6c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61  ccording to aiMa
1a6d0 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  p */.    rLhs = 
1a6e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a6f0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63  nge(pParse, nVec
1a700 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
1a710 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1a720 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a730 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a740 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67  P_Copy, rLhsOrig
1a750 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69  +i, rLhs+aiMap[i
1a760 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], 0);.    }.  }
1a770 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65  ..  /* If sqlite
1a780 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64  3FindInIndex() d
1a790 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63  id not find or c
1a7a0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74  reate an index t
1a7b0 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74  hat is.  ** suit
1a7c0 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74  able for evaluat
1a7d0 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ing the IN opera
1a7e0 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  tor, then evalua
1a7f0 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20  te using a.  ** 
1a800 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
1a810 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  arisons..  **.  
1a820 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20  ** This is step 
1a830 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70  (1) in the in-op
1a840 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69  erator.md optimi
1a850 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  zed algorithm.. 
1a860 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1a870 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29  =IN_INDEX_NOOP )
1a880 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
1a890 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
1a8a0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c  .pList;.    Coll
1a8b0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
1a8c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1a8d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a8e0 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c  Left);.    int l
1a8f0 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33  abelOk = sqlite3
1a900 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1a910 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72  arse);.    int r
1a920 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
1a930 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
1a940 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
1a950 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1a960 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1a970 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1a980 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
1a990 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
1a9a0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
1a9b0 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
1a9c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1a9d0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1a9e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a9f0 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73   OP_BitAnd, rLhs
1aa00 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c  , rLhs, regCkNul
1aa10 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
1aa20 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
1aa30 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1aa40 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1aa50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1aa60 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
1aa70 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
1aa80 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
1aa90 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
1aaa0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1aab0 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
1aac0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1aad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1aae0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
1aaf0 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
1ab00 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1ab10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ab20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
1ab30 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
1ab40 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1ab50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ab60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ab70 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f  Eq, rLhs, labelO
1ab80 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1abb0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1abc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1abd0 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
1abe0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1abf0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ac00 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
1ac10 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
1ac20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ac30 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29  geP5(v, zAff[0])
1ac40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ac50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1ac60 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
1ac70 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20  fFalse );.      
1ac80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ac90 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1aca0 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  hs, destIfFalse,
1acb0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1acd0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1ace0 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
1acf0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1ad00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1ad10 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1ad20 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ] | SQLITE_JUMPI
1ad30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1ad40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1ad50 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1ad60 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
1ad70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
1ad80 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
1ad90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ada0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1adb0 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
1adc0 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
1add0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1ade0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1adf0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1ae00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1ae10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ae20 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a  el(v, labelOk);.
1ae30 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1ae40 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ae50 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1ae60 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1ae70 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1ae80 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  d;.  }..  /* Ste
1ae90 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65  p 2: Check to se
1aea0 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e  e if the LHS con
1aeb0 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63  tains any NULL c
1aec0 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a  olumns.  If the.
1aed0 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f    ** LHS does co
1aee0 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e  ntain NULLs then
1aef0 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1af00 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45   be either FALSE
1af10 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57   or NULL..  ** W
1af20 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70  e will then skip
1af30 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1af40 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ch of the RHS.. 
1af50 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1af60 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1af70 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65  e ){.    destSte
1af80 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  p2 = destIfFalse
1af90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1afa0 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53  estStep2 = destS
1afb0 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  tep6 = sqlite3Vd
1afc0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1afd0 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  se);.  }.  for(i
1afe0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1aff0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1b000 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
1b010 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
1b020 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
1b030 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b040 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
1b050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b070 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20  IsNull, rLhs+i, 
1b080 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20  destStep2);.    
1b090 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b0a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b0b0 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20  /* Step 3.  The 
1b0c0 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e  LHS is now known
1b0d0 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e   to be non-NULL.
1b0e0 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20    Do the binary 
1b0f0 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74  search.  ** of t
1b100 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65  he RHS using the
1b110 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e   LHS as a probe.
1b120 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20    If found, the 
1b130 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74  result is.  ** t
1b140 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rue..  */.  if( 
1b150 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1b160 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
1b170 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1b180 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
1b190 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
1b1a0 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73  ee and so we als
1b1b0 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68  o.    ** know th
1b1c0 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  at the RHS is no
1b1d0 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  n-NULL.  Hence, 
1b1e0 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  we combine steps
1b1f0 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20   3 and 4.    ** 
1b200 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
1b210 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  code. */.    sql
1b220 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b230 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
1b240 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b250 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64  e, rLhs);.    Vd
1b260 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b270 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
1b280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b290 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20  p0(v, OP_Goto); 
1b2a0 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20   /* Return True 
1b2b0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1b2c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b2d0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1b2e0 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c  , rLhs, nVector,
1b2f0 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f   0, zAff, nVecto
1b300 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74  r);.    if( dest
1b310 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1b320 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
1b330 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61  Combine Step 3 a
1b340 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61  nd Step 5 into a
1b350 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a   single opcode *
1b360 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1b370 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1b380 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61  OP_NotFound, iTa
1b390 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a  b, destIfFalse,.
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1b3c0 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1b3d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b3e0 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1b3f0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1b400 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1b410 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c  Ordinary Step 3,
1b420 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
1b430 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55  ere FALSE and NU
1b440 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  LL are distinct 
1b450 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  */.    addrTruth
1b460 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1b470 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1b480 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a  Found, iTab, 0,.
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b4c0 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b4d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1b4e0 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
1b4f0 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
1b500 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
1b510 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
1b520 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
1b530 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
1b540 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1b550 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
1b560 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
1b570 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
1b580 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
1b590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b5a0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1b5b0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
1b5c0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
1b5d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b5e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
1b5f0 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
1b600 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
1b610 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1b620 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
1b630 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
1b640 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
1b650 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1b660 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1b670 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
1b680 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
1b690 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
1b6a0 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
1b6b0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
1b6c0 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
1b6d0 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
1b6e0 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
1b6f0 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
1b700 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b710 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
1b720 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
1b730 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
1b740 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
1b750 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
1b760 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
1b770 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
1b780 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
1b790 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
1b7a0 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
1b7b0 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1b7c0 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
1b7d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b7e0 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
1b7f0 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
1b800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b810 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1b820 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b830 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
1b840 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65  ge(v);.  if( nVe
1b850 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65  ctor>1 ){.    de
1b860 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69  stNotNull = sqli
1b870 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b880 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
1b890 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
1b8a0 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
1b8b0 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
1b8c0 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
1b8d0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
1b8e0 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
1b8f0 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
1b900 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
1b910 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
1b920 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
1b930 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1b940 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1b950 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
1b960 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
1b970 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
1b980 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1b990 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
1b9a0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
1b9b0 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
1b9c0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
1b9d0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1b9e0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1b9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba00 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1ba10 20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20   iTab, i, r3);. 
1ba20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ba30 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1ba40 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75  Lhs+i, destNotNu
1ba50 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  ll, r3,.        
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1ba70 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1ba80 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62  OLLSEQ);.    Vdb
1ba90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1baa0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bab0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bac0 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r3);.  }.  sqlit
1bad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bae0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1baf0 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e  IfNull);.  if( n
1bb00 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1bb10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1bb20 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e  veLabel(v, destN
1bb30 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  otNull);.    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 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
1bb60 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1bb70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bb80 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1bb90 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1bba0 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1bbb0 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1bbc0 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1bbd0 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1bbe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bbf0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1bc00 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1bc10 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1bc20 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1bc30 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1bc40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1bc50 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1bc60 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1bc70 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1bc80 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1bc90 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1bca0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1bcb0 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1bcc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1bcd0 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
1bce0 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
1bcf0 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
1bd00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bd10 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
1bd20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
1bd30 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1bd40 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
1bd50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1bd60 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
1bd70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bd80 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
1bd90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1bda0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1bdb0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
1bdc0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1bdd0 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
1bde0 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
1bdf0 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1be00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
1be10 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
1be20 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
1be30 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
1be40 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
1be50 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
1be60 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
1be70 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
1be80 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
1be90 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
1bea0 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
1beb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bec0 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
1bed0 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
1bee0 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
1bef0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
1bf00 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
1bf10 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
1bf20 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1bf30 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
1bf40 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1bf50 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1bf60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
1bf70 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
1bf80 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
1bf90 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
1bfa0 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
1bfb0 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
1bfc0 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
1bfd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bfe0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1bff0 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
1c000 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1c010 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
1c020 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
1c030 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1c040 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1c050 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
1c060 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
1c070 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
1c080 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1c090 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
1c0a0 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
1c0b0 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
1c0c0 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
1c0d0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
1c0e0 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
1c0f0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1c100 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
1c110 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
1c120 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c130 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
1c140 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1c150 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
1c160 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
1c170 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
1c180 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
1c190 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
1c1a0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
1c1b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c1c0 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
1c1d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c1e0 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
1c1f0 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
1c200 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
1c210 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
1c220 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1c230 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
1c240 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1c250 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28  alue);.    if( (
1c260 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67  c==3 && !negFlag
1c270 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28  ) || (c==2) || (
1c280 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65  negFlag && value
1c290 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1c2a0 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  )){.#ifdef SQLIT
1c2b0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1c2c0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
1c2d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c2e0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
1c2f0 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
1c300 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
1c310 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
1c320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c330 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
1c340 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1c350 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
1c360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c370 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c380 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
1c390 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
1c3a0 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22  %s", negFlag?"-"
1c3b0 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65  :"",z);.      }e
1c3c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1c3d0 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
1c3e0 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
1c3f0 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
1c400 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1c410 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  se{.      if( ne
1c420 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
1c430 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54   c==3 ? SMALLEST
1c440 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
1c450 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c460 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1c470 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
1c480 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1c490 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
1c4a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1c4b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1c4c0 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e  hat will load in
1c4d0 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f  to register regO
1c4e0 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ut a value that 
1c4f0 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  is.** appropriat
1c500 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f  e for the iIdxCo
1c510 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
1c520 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f  ndex pIdx..*/.vo
1c530 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1c540 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
1c550 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1c560 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73  se,  /* The pars
1c570 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1c580 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
1c590 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
1c5a0 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f  ose column is to
1c5b0 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1c5c0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1c5d0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1c5e0 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f  ng to a table ro
1c5f0 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  w */.  int iIdxC
1c600 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ol,    /* The co
1c610 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1c620 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  x to be loaded *
1c630 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1c640 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
1c650 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61   index column va
1c660 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
1c670 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36  ster */.){.  i16
1c680 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d   iTabCol = pIdx-
1c690 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f  >aiColumn[iIdxCo
1c6a0 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f  l];.  if( iTabCo
1c6b0 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  l==XN_EXPR ){.  
1c6c0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1c6d0 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20  aColExpr );.    
1c6e0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1c6f0 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49  olExpr->nExpr>iI
1c700 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61  dxCol );.    pPa
1c710 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
1c720 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20  iTabCur + 1;.   
1c730 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c740 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1c750 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1c760 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1c770 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72  egOut);.    pPar
1c780 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
1c790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1c7a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c7b0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70  tColumnOfTable(p
1c7c0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49  Parse->pVdbe, pI
1c7d0 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62  dx->pTable, iTab
1c7e0 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c           iTabCol
1c810 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1c820 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c830 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
1c840 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1c850 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
1c860 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
1c870 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c880 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c890 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
1c8a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1c8b0 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
1c8c0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
1c8d0 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
1c8e0 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
1c8f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
1c900 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c910 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1c920 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20  cursor.  Or the 
1c930 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49  PK cursor for WI
1c940 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
1c950 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
1c960 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1c970 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
1c980 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
1c990 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
1c9a0 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ct the value int
1c9b0 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
1c9c0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62  */.){.  if( pTab
1c9d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c9e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c9f0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43  OP_Column, iTabC
1ca00 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ur, iCol, regOut
1ca10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1ca20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20   }.  if( iCol<0 
1ca30 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
1ca40 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
1ca50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ca60 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
1ca70 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
1ca80 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
1ca90 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
1caa0 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
1cab0 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
1cac0 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
1cad0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1cae0 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72  (pTab) && !IsVir
1caf0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1cb00 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
1cb10 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
1cb20 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1cb30 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
1cb40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1cb50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1cb60 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
1cb70 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
1cb80 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1cb90 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
1cba0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
1cbb0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1cbc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1cbd0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1cbe0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
1cbf0 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
1cc00 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
1cc10 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
1cc20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1cc30 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1cc40 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  g. .**.** There 
1cc50 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1cc60 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
1cc70 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
1cc80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
1cc90 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
1cca0 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
1ccb0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
1ccc0 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
1ccd0 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
1cce0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ccf0 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1cd00 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1cd10 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1cd20 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1cd30 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1cd40 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1cd50 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1cd60 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1cd70 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1cd80 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1cd90 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1cda0 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1cdb0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1cdc0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1cdd0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1cde0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1cdf0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
1ce00 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1ce10 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
1ce20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
1ce30 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
1ce40 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20   + FLAGS */.){. 
1ce50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1ce60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1ce70 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1ce80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ce90 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1cea0 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1ceb0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1cec0 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1ced0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1cee0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20  P5(v, p5);.  }. 
1cef0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
1cf00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cf10 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1cf20 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1cf30 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1cf40 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1cf50 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1cf60 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g-1..*/.void sql
1cf70 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1cf80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1cf90 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1cfa0 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1cfb0 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1cfc0 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1cfd0 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1cfe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cff0 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1d000 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1d010 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a  , iTo, nReg);.}.
1d020 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1d030 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1d040 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1d050 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1d060 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1d070 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1d080 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1d090 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1d0a0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1d0b0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1d0c0 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1d0d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1d0e0 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1d0f0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1d100 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1d110 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1d120 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1d130 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1d140 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1d150 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1d160 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1d170 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1d180 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1d190 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1d1a0 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1d1b0 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1d1c0 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1d1d0 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1d1e0 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1d1f0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1d200 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1d210 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1d220 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1d230 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1d240 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1d250 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1d260 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1d270 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1d280 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1d290 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1d2a0 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  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 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1d2d0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1d2e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d2f0 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1d300 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1d310 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1d320 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1d330 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1d340 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1d350 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1d360 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1d370 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1d380 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1d390 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1d3a0 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1d3b0 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1d3c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1d3d0 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1d3e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d3f0 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1d400 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1d410 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66  TK_SELECT ){.#if
1d420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1d430 51 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73  QUERY.      iRes
1d440 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  ult = 0;.#else. 
1d450 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1d460 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1d470 65 63 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ect(pParse, p);.
1d480 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d490 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d4a0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1d4b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1d4c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1d4d0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1d4e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d4f0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1d500 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d510 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1d520 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1d530 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1d540 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1d550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d560 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1d570 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1d580 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1d590 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1d5a0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1d5b0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1d5c0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1d5d0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d5e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1d5f0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1d600 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1d610 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1d620 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1d630 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1d640 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1d650 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1d660 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1d670 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1d680 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1d690 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1d6a0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1d6b0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1d6c0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1d6d0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1d6e0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1d6f0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1d700 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1d710 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1d720 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1d730 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1d740 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d750 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1d760 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1d770 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1d780 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d790 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1d7a0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1d7b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1d7c0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1d7d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d7e0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1d7f0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1d800 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1d810 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1d820 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1d830 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1d840 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1d850 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d860 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d870 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d880 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d890 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1d8a0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1d8b0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1d8c0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1d8d0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1d8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1d8f0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1d900 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1d910 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1d920 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1d930 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1d940 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1d950 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1d960 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1d970 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1d980 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1d990 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d9a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d9b0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1d9c0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f  rn 0;.  }..expr_
1d9d0 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69  code_doover:.  i
1d9e0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1d9f0 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1da00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1da10 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1da20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1da30 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1da40 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1da50 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1da60 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1da70 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1da80 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1da90 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1daa0 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1dab0 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1dac0 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1dad0 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1dae0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1daf0 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1db00 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1db10 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1db20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1db30 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1db40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1db50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1db60 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1db70 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1db80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1dba0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1dbb0 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1dbc0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1dbd0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1dbe0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1dbf0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1dc00 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1dc10 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1dc20 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1dc30 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1dc40 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1dc50 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1dc60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1dc70 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
1dc80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1dc90 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  s COLUMN express
1dca0 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
1dcb0 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74 6f 20  constant due to 
1dcc0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1dcd0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1dce0 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  nts, and that co
1dcf0 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65 64 20  nstant is coded 
1dd00 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  by the pExpr->pL
1dd10 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  eft.        ** e
1dd20 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77  xpresssion.  How
1dd30 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72 65 20  ever, make sure 
1dd40 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68 61 73  the constant has
1dd50 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1dd60 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79 70 65       ** datatype
1dd70 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65   by applying the
1dd80 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
1dd90 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f   table column to
1dda0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1ddb0 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20 20 20  constant..      
1ddc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
1ddd0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1dde0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1ddf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1de00 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20 20  ft,target);.    
1de10 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20 73 71      int aff = sq
1de20 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
1de30 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1de40 79 2e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  y.pTab, pExpr->i
1de50 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1de60 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54 45   if( aff!=SQLITE
1de70 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
1de80 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
1de90 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d 20  nst char zAff[] 
1dea0 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c 30  = "B\000C\000D\0
1deb0 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20 20  00E";.          
1dec0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1ded0 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a  FF_BLOB=='A' );.
1dee0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1def0 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ( SQLITE_AFF_TEX
1df00 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20 20  T=='B' );.      
1df10 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61      if( iReg!=ta
1df20 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1df30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1df40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1df50 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 29  y, iReg, target)
1df60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 52  ;.            iR
1df70 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1df80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dfa0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1dfb0 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c  ity, iReg, 1, 0,
1dfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
1dfe0 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c  ff[(aff-'B')*2],
1dff0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1e000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1e010 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20 20  eturn iReg;.    
1e020 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54    }.      if( iT
1e030 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1e040 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  if( pParse->iSel
1e050 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  fTab<0 ){.      
1e060 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
1e070 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
1e080 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
1e090 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
1e0a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
1e0b0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1e0c0 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d  Column - pParse-
1e0d0 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
1e0e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e0f0 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e      /* Coding an
1e100 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1e110 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   is part of an i
1e120 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d  ndex where colum
1e130 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20  n names.        
1e140 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
1e150 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  x refer to the t
1e160 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  able to which th
1e170 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20  e index belongs 
1e180 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
1e190 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  b = pParse->iSel
1e1a0 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20  fTab - 1;.      
1e1b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e1c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e1d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1e1e0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1e1f0 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  >y.pTab,.       
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1e220 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
1e230 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
1e260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e270 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1e280 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1e290 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e2a0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e2b0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e2c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e2d0 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a  TK_TRUEFALSE: {.
1e2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e2f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e300 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78  teger, sqlite3Ex
1e310 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
1e320 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  pr), target);.  
1e330 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e340 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1e350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1e360 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1e370 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1e380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e390 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e3a0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e3b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
1e3c0 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
1e3d0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
1e3e0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1e3f0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e400 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1e410 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1e420 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e430 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e440 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e450 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e460 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1e470 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1e480 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1e490 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e4a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e4b0 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
1e4c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e4d0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1e4e0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e4f0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e500 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e510 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1e520 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1e530 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1e540 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1e550 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1e560 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1e570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e580 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e590 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e5a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1e5b0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e5c0 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1e5d0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e5e0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1e5f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e600 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1e610 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1e620 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e630 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1e640 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1e650 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1e660 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1e670 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1e680 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1e690 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1e6a0 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1e6b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e6c0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1e6d0 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1e6e0 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1e6f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e700 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e710 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e720 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1e730 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e740 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e750 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e760 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e770 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
1e780 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1e790 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e7a0 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
1e7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e7c0 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
1e7d0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1e7e0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1e7f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
1e800 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
1e810 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1e820 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1e830 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
1e840 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70  Parse->pVList, p
1e850 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1e860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e870 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e880 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d  0]=='?' || strcm
1e890 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1e8a0 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n, z)==0 );.    
1e8b0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69      pParse->pVLi
1e8c0 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e  st[0] = 0; /* In
1e8d0 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79  dicate VList may
1e8e0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e   no longer be en
1e8f0 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  larged */.      
1e900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
1e910 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29  endP4(v, (char*)
1e920 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  z, P4_STATIC);. 
1e930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e940 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e950 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
1e960 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1e970 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54  return pExpr->iT
1e980 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  able;.    }.#ifn
1e990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e9a0 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1e9b0 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1e9c0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1e9d0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1e9e0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1e9f0 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
1ea00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ea10 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1ea20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1ea30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1ea40 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1ea50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ea60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ea70 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1ea80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ea90 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1eaa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eac0 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
1ead0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1eaf0 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1eb00 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1eb10 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65  n, 0));.      re
1eb20 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20  turn inReg;.    
1eb30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1eb40 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
1eb50 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1eb60 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1eb70 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  T:.      op = (o
1eb80 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1eb90 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1eba0 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c   p5 = SQLITE_NUL
1ebb0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61  LEQ;.      /* fa
1ebc0 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll-through */.  
1ebd0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1ebe0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1ebf0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1ec00 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1ec10 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1ec20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1ec30 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1ec40 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1ec50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ec60 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
1ec70 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
1ec80 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70    codeVectorComp
1ec90 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1eca0 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70  r, target, op, p
1ecb0 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  5);.      }else{
1ecc0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1ecd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ece0 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1ecf0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ed00 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1ed10 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ed20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ed30 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1ed40 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  .        codeCom
1ed50 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
1ed60 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1ed70 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1ed80 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
1ed90 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
1eda0 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20   | p5);.        
1edb0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1edc0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1edd0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1ede0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1edf0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Lt);.        
1ee00 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
1ee10 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
1ee20 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
1ee30 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ee40 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Le);.        
1ee50 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1ee60 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1ee70 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1ee80 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ee90 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Gt);.        
1eea0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1eeb0 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1eec0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1eed0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1eee0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ge);.        
1eef0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1ef00 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1ef10 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1ef20 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ef30 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20  OP_Eq);.        
1ef40 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
1ef50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
1ef60 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
1ef70 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ef80 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ne);.        
1ef90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1efa0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1efb0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1efc0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1efd0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1efe0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1eff0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
1f000 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
1f010 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
1f020 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
1f030 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
1f040 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
1f050 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1f060 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1f070 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
1f080 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
1f090 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
1f0a0 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
1f0b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1f0c0 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
1f0d0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
1f0e0 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
1f0f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f100 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
1f110 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
1f120 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
1f130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f140 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
1f150 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
1f160 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
1f170 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f180 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
1f190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f1a0 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
1f1b0 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
1f1c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
1f1d0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1f1e0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
1f1f0 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
1f200 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f210 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
1f220 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
1f230 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
1f240 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f250 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
1f260 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f270 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
1f280 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
1f290 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
1f2a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f2b0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
1f2c0 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
1f2d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
1f2e0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
1f2f0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
1f300 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
1f310 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f320 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
1f330 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f340 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
1f350 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
1f360 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
1f370 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f380 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
1f390 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
1f3a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f3b0 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
1f3c0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f3d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f3e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f3f0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f400 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f410 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f420 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f430 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f450 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
1f460 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f470 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f480 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f490 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f4a0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f4b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f4c0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1f4d0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f4e0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f4f0 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
1f500 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
1f510 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
1f520 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1f530 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
1f540 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
1f550 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  t, 1, target);. 
1f560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1f570 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  rget;.#ifndef SQ
1f580 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1f590 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1f5a0 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1f5b0 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1f5c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f5d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f5e0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f5f0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1f600 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1f610 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1f620 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f630 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1f650 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
1f660 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
1f670 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
1f680 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
1f690 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
1f6a0 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
1f6b0 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
1f6c0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1f6d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f6e0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
1f6f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f700 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f710 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f720 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f730 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1f740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f750 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1f760 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
1f770 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f780 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f790 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f7a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1f7b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f7c0 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
1f7d0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1f7e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1f7f0 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
1f800 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1f810 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
1f820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f830 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20  _NOT==OP_Not ); 
1f840 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f850 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
1f860 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f870 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f880 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f890 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f8a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f8b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f8d0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1f8e0 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
1f8f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f900 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
1f910 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54   {.      int isT
1f920 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52  rue;    /* IS TR
1f930 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
1f940 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  E */.      int b
1f950 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20  Normal;   /* IS 
1f960 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45  TRUE or IS FALSE
1f970 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
1f980 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f990 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f9a0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f9b0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1f9c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f9d0 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65   );.      isTrue
1f9e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
1f9f0 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
1fa00 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62  pRight);.      b
1fa10 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e  Normal = pExpr->
1fa20 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20  op2==TK_IS;.    
1fa30 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
1fa40 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1fa50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa60 21 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d  !isTrue && bNorm
1fa70 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  al);.      sqlit
1fa80 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1fa90 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31  v, OP_IsTrue, r1
1faa0 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65  , inReg, !isTrue
1fab0 2c 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d  , isTrue ^ bNorm
1fac0 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
1fad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fae0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1faf0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fb00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1fb10 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1fb20 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1fb30 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1fb40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1fb50 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1fb60 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1fb70 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1fb80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fb90 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1fba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fbb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fbc0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1fbd0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fbe0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fbf0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fc00 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fc20 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fc30 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1fc40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1fc50 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1fc60 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fc70 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1fc80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fc90 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1fca0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1fcb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fcc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fcd0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1fce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1fcf0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1fd00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fd10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1fd20 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1fd30 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1fd40 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1fd50 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1fd60 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1fd70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1fd80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fd90 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1fda0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1fdb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fdc0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1fdd0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1fde0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1fdf0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1fe00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fe10 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1fe20 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1fe30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1fe40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fe50 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1fe60 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1fe70 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1fe80 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1fe90 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1fea0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1feb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1fec0 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1fed0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1fee0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1fef0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1ff00 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1ff10 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1ff20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1ff30 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1ff40 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1ff50 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
1ff60 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
1ff70 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ff80 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1ff90 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
1ffa0 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
1ffb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1ffc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1ffd0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
1ffe0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fff0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
20000 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20010 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
20020 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
20030 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
20040 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
20050 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
20060 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
20070 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
20080 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
20090 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64  quence */..#ifnd
200a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
200b0 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
200c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
200d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
200e0 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
200f0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
20100 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  y.pWin->regResul
20110 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
20120 66 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e  f..      if( Con
20130 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
20140 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  e) && sqlite3Exp
20150 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
20160 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
20170 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
20180 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70  tions can be exp
20190 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74  ensive. So try t
201a0 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20  o move constant 
201b0 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
201c0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
201d0 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e  inner loop, even
201e0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61   if that means a
201f0 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e  n extra OP_Copy.
20200 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
20210 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
20220 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
20230 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20   pExpr, -1);.   
20240 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
20250 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20260 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
20270 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
20280 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
20290 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
202a0 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
202b0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
202c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
202d0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
202e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
202f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
20300 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
20310 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
20320 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
20330 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20340 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
20350 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
20360 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
20370 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
20380 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
20390 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
203a0 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
203b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
203c0 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
203d0 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
203e0 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
203f0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
20400 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
20410 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
20420 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
20430 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
20440 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20450 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20460 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
20470 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
20480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20490 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
204a0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
204b0 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
204c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
204d0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
204e0 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
204f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
20500 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
20510 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
20520 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
20530 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
20540 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
20550 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
20560 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
20570 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
20580 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
20590 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
205a0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
205b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
205c0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
205d0 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
205e0 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
205f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
20600 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
20610 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
20620 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20630 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20640 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
20650 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20660 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
20670 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
20680 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
206a0 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
206b0 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
206c0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
206d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
206e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
206f0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
20700 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
20710 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20720 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
20730 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20740 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
20750 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
20760 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20770 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
20780 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
20790 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
207a0 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
207b0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
207c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
207d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
207e0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
207f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20800 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
20810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20820 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
20830 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20840 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
20850 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20860 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
20870 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66  t);.      }..#if
20880 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20890 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46  .      /* The AF
208a0 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f  FINITY() functio
208b0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
208c0 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
208d0 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20  cribes.      ** 
208e0 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
208f0 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
20900 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  t.  This is used
20910 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a   for testing of.
20920 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
20930 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a  ite type logic..
20940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20950 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20960 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20970 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20  _AFFINITY ){.   
20980 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20990 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c  *azAff[] = { "bl
209a0 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75  ob", "text", "nu
209b0 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72  meric", "integer
209c0 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20  ", "real" };.   
209d0 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20       char aff;. 
209e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
209f0 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
20a00 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
20a10 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61  ExprAffinity(pFa
20a20 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
20a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a40 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
20a50 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20  , target, .     
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61           aff ? a
20a80 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f  zAff[aff-SQLITE_
20a90 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e  AFF_BLOB] : "non
20aa0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
20ab0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20ac0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20ad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
20ae0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20af0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
20b00 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20b10 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
20b20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
20b40 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
20b50 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
20b60 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
20b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20b80 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20b90 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20ba0 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
20bb0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
20bc0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
20bd0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
20be0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20bf0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
20c00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20c10 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
20c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
20c30 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
20c40 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
20c50 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
20c60 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
20c70 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
20c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20c90 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
20ca0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
20cb0 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
20cc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
20cd0 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
20ce0 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
20cf0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
20d00 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
20d10 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
20d20 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
20d30 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
20d40 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
20d50 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
20d60 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
20d70 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
20d80 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
20d90 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
20da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
20db0 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
20dc0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
20dd0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
20de0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
20df0 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
20e00 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
20e10 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
20e20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
20e30 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20e40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20e50 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
20e60 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
20e70 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
20e80 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
20e90 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
20ea0 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
20eb0 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
20ec0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
20ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
20ee0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
20ef0 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
20f00 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
20f10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20f20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
20f30 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
20f40 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
20f50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20f60 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20f70 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
20f80 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
20f90 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20fa0 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
20fc0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
20fd0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20fe0 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
20ff0 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
21000 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21020 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
21030 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
21040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
21070 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
21080 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TOR);.      }els
21090 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
210a0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
210b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
210c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
210d0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
210e0 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
210f0 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
21100 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
21110 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
21120 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
21130 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21140 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
21150 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
21160 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
21170 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
21180 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
21190 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
211a0 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
211b0 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
211c0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
211d0 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
211e0 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
211f0 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
21200 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
21210 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
21220 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
21230 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
21240 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
21250 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
21260 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
21270 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
21280 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21290 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
212a0 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
212b0 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
212c0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
212d0 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
212e0 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
212f0 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
21300 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
21310 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
21320 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
21330 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
21340 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
21350 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
21360 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21370 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72  nFarg>=2 && Expr
21380 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21390 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29  r, EP_InfixFunc)
213a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
213b0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
213c0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
213d0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
213e0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
213f0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
21400 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
21410 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21420 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21430 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21440 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21450 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21460 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21470 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21480 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21490 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
214a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
214b0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
214c0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
214d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
214e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
214f0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
21500 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
21510 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21520 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
21530 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
21540 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
21550 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21570 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21580 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21590 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
215a0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
215b0 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
215c0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
215d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
215e0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
215f0 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
21600 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
21610 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
21620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21640 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21650 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21660 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
21670 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
21680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21690 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
216a0 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
216b0 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
216c0 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
216f0 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
21700 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
21710 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
21720 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21730 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
21740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21750 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
21760 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
21770 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21780 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21790 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
217a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
217b0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
217c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
217d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
217e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
217f0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
21800 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
21810 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
21820 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21830 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
21840 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21850 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21860 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
21870 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
21880 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21890 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
218a0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
218b0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
218c0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
218d0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
218e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
218f0 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
21900 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
21910 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
21920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21930 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
21940 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
21950 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
21960 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
21970 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
21980 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
21990 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
219a0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
219b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
219c0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
219d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
219e0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
219f0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
21a00 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
21a10 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
21a20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
21a30 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
21a40 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
21a50 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
21a60 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
21a70 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
21a80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21a90 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
21aa0 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
21ab0 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21ae0 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
21af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21b00 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
21b10 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
21b20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
21b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
21b40 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
21b50 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
21b60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21b70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
21b80 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
21b90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21ba0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
21bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21bc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21bd0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21be0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21bf0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
21c00 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
21c10 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
21c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
21c40 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
21c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21c60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21c70 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
21c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
21ca0 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
21cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21cc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21cd0 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
21ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
21cf0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
21d00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21d10 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
21d20 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
21d30 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
21d40 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
21d50 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
21d60 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
21d70 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
21d80 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
21d90 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
21da0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
21db0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
21dc0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21dd0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
21de0 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
21df0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21e00 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
21e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21e20 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
21e30 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
21e40 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
21e50 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
21e60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21e70 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
21e80 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
21e90 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
21ea0 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
21eb0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
21ec0 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
21ed0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74  pLeft;.      got
21ee0 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  o expr_code_doov
21ef0 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32  er; /* 2018-04-2
21f00 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20  8: Prevent deep 
21f10 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75  recursion. OSSFu
21f20 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  zz. */.    }..  
21f30 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
21f40 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
21f50 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
21f60 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
21f70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
21f80 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
21f90 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
21fa0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
21fb0 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
21fc0 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
21fd0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
21fe0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
21ff0 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
22000 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
22010 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
22020 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
22030 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
22040 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
22050 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
22060 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
22070 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
22080 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
22090 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
220a0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
220b0 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
220c0 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
220d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
220e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
220f0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
22100 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
22110 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
22120 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
22130 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
22140 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
22150 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
22160 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
22170 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
22180 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
22190 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
221a0 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
221b0 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
221c0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
221d0 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
221e0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
221f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
22200 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
22210 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
22220 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
22230 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
22240 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
22250 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
22260 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
22270 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
22280 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
22290 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
222a0 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
222b0 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
222c0 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
222d0 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
222e0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
222f0 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
22300 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
22310 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
22320 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
22330 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22340 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
22350 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
22360 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
22370 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
22380 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
22390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
223a0 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
223b0 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
223c0 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
223d0 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
223e0 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
223f0 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
22400 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
22410 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
22420 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
22430 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
22440 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
22450 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
22460 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
22470 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b  = pExpr->y.pTab;
22480 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
22490 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
224a0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
224b0 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
224c0 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
224d0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
224e0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
224f0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
22500 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22510 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
22520 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
22530 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
22540 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
22550 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
22560 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
22570 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
22580 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
22590 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
225a0 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
225b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
225c0 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
225d0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
225e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
225f0 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c  , "r[%d]=%s.%s",
22600 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
22610 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
22620 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
22630 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
22640 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
22650 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 79  owid" : pExpr->y
22660 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  .pTab->aCol[pExp
22670 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
22680 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  e).      ));..#i
22690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
226a0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
226b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
226c0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
226d0 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
226e0 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
226f0 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
22700 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
22710 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
22720 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
22730 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
22740 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
22750 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
22760 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53   R-60985-57662 S
22770 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65  QLite will conve
22780 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63  rt the value bac
22790 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c  k to.      ** fl
227a0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65  oating point whe
227b0 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20  n extracting it 
227c0 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
227d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
227e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
227f0 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
22800 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22810 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
22820 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
22830 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
22840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22850 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
22860 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
22870 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22890 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
228a0 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20  VECTOR: {.      
228b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
228c0 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
228d0 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
228e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
228f0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46  ..    case TK_IF
22900 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20  _NULL_ROW: {.   
22910 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a     int addrINR;.
22920 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d 20        addrINR = 
22930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22940 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  1(v, OP_IfNullRo
22950 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  w, pExpr->iTable
22960 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
22970 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22980 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
22990 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
229a0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
229b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
229c0 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20  v, addrINR);.   
229d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
229e0 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e  angeP3(v, addrIN
229f0 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  R, inReg);.     
22a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22a10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
22a20 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
22a30 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
22a40 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
22a50 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
22a60 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
22a70 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
22a80 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
22a90 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
22aa0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
22ab0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
22ac0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22ad0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22ae0 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
22af0 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
22b00 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
22b10 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
22b20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
22b30 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
22b40 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
22b50 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
22b60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
22b70 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
22b80 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22b90 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
22ba0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
22bb0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
22bc0 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20   ** Y is in the 
22bd0 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  last element of 
22be0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69  pExpr->x.pList i
22bf0 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
22c00 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a  ->nExpr is.    *
22c10 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73  * odd.  The Y is
22c20 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
22c30 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
22c40 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e  f elements in x.
22c50 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20  pList.    ** is 
22c60 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20  even, then Y is 
22c70 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20  omitted and the 
22c80 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75  "otherwise" resu
22c90 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  lt is NULL..    
22ca0 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
22cb0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
22cc0 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
22cd0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
22ce0 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
22cf0 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
22d00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22d10 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
22d20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
22d30 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
22d40 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
22d50 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
22d60 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
22d70 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
22d80 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
22d90 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
22da0 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
22db0 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
22dc0 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
22dd0 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
22de0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
22df0 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
22e00 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
22e10 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
22e20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22e30 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
22e40 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
22e50 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
22e60 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
22e90 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
22ea0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22ed0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22ee0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
22ef0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
22f00 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
22f10 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
22f20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
22f30 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
22f40 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
22f50 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
22f60 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
22f70 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22f90 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
22fa0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
22fb0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22fd0 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
22fe0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
22ff0 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
23000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
23010 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
23020 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
23030 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
23040 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23050 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
23060 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
23070 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
23080 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
23090 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
230a0 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
230b0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
230c0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
230d0 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
230e0 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
230f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
23100 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
23110 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23120 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
23130 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
23140 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
23150 29 7b 0a 20 20 20 20 20 20 20 20 65 78 70 72 4e  ){.        exprN
23160 6f 64 65 43 6f 70 79 28 26 74 65 6d 70 58 2c 20  odeCopy(&tempX, 
23170 70 58 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  pX);.        tes
23180 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
23190 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
231a0 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
231b0 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43  er(&tempX, exprC
231c0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
231d0 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
231e0 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
231f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
23200 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
23210 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72  memset(&opCompar
23220 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43  e, 0, sizeof(opC
23230 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20  ompare));.      
23240 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
23250 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
23260 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
23270 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
23280 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
23290 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
232a0 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
232b0 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
232c0 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
232d0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
232e0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
232f0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
23300 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
23310 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
23320 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
23330 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
23340 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
23350 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
23360 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
23370 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
23380 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
23390 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
233a0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
233b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
233c0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
233d0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
233e0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
233f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
23400 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
23410 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
23420 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
23430 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23450 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
23460 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23480 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
23490 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
234a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
234b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
234c0 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
234d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
234e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
234f0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
23500 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
23510 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
23530 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
23540 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
23550 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
23560 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23570 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
23580 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
23590 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
235a0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
235b0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
235c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
235d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
235e0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
235f0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
23600 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
23610 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23620 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
23630 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
23640 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
23650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23670 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
23680 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
23690 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
236a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
236b0 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
236c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
236d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
236e0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
236f0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
23700 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
23710 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
23720 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
23730 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
23740 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23750 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
23760 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
23770 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
23780 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23790 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
237a0 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
237b0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
237c0 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
237d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
237e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
237f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
23800 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
23810 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
23820 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
23830 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
23840 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
23850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23860 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
23870 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
23880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23890 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
238a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
238b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
238c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
238d0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
238e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
238f0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
23900 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
23910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23920 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
23930 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
23940 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
23950 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
23960 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
23970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
23980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23990 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
239a0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
239b0 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
239c0 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
239f0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
23a00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
23a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
23a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23a30 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
23a40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23a50 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
23a60 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
23a70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23a80 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
23a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
23aa0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
23ab0 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
23ac0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
23ad0 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
23ae0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
23af0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74  **.** If regDest
23b00 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73  >=0 then the res
23b10 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74  ult is always st
23b20 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67  ored in that reg
23b30 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a  ister and the.**
23b40 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72   result is not r
23b50 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67  eusable.  If reg
23b60 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73  Dest<0 then this
23b70 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65   routine is free
23b80 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68   to .** store th
23b90 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65  e value whereeve
23ba0 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65  r it wants.  The
23bb0 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
23bc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
23bd0 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20  ** is stored is 
23be0 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20  returned.  When 
23bf0 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69  regDest<0, two i
23c00 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73  dentical express
23c10 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64  ions will.** cod
23c20 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65  e to the same re
23c30 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
23c40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
23c50 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70  Init(.  Parse *p
23c60 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
23c70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
23c80 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
23c90 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
23ca0 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68  ssion to code wh
23cb0 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74  en the VDBE init
23cc0 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74  ializes */.  int
23cd0 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f   regDest       /
23ce0 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
23cf0 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
23d00 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  er */.){.  ExprL
23d10 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
23d20 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
23d30 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
23d40 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
23d50 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65  xpr;.  if( regDe
23d60 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20  st<0 && p ){.   
23d70 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23d80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
23d90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23da0 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
23db0 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
23dc0 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
23dd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
23de0 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
23df0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70  3ExprCompare(0,p
23e00 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
23e10 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
23e20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
23e30 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
23e40 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
23e50 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73  .  }.  pExpr = s
23e60 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
23e70 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
23e80 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
23e90 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
23ea0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
23eb0 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
23ec0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23ed0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
23ee0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
23ef0 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
23f00 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44  >reusable = regD
23f10 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20  est<0;.     if( 
23f20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44  regDest<0 ) regD
23f30 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  est = ++pParse->
23f40 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d  nMem;.     pItem
23f50 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
23f60 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d  g = regDest;.  }
23f70 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
23f80 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74  tExpr = p;.  ret
23f90 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a  urn regDest;.}..
23fa0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23fb0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
23fc0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
23fd0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
23fe0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
23ff0 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
24000 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
24010 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
24020 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
24030 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
24040 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
24050 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
24060 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
24070 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
24080 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
24090 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
240a0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
240b0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
240c0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
240d0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
240e0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
240f0 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
24100 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
24110 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
24120 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
24130 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
24140 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
24150 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
24160 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
24170 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
24180 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
24190 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
241a0 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
241b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
241c0 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
241d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
241e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
241f0 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
24200 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24210 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
24220 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
24230 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24240 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
24250 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
24260 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
24270 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
24280 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
24290 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
242a0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
242b0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
242c0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
242d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
242e0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
242f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
24300 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
24310 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
24320 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
24330 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
24340 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
24350 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
24360 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24370 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24380 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
24390 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
243a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
243b0 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
243c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
243d0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
243e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
243f0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
24400 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
24410 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
24420 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
24430 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
24440 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
24450 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
24460 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
24470 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
24480 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24490 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
244a0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
244b0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
244c0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
244d0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
244e0 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
244f0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
24500 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24510 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
24520 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
24530 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
24540 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
24550 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
24560 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
24570 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
24580 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
24590 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
245a0 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
245b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
245c0 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
245d0 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
245e0 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
245f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24600 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
24610 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
24620 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
24630 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
24640 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
24650 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
24660 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
24670 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
24680 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
24690 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
246a0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
246b0 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
246c0 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
246d0 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
246e0 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
246f0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
24700 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
24710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24720 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
24730 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24740 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24750 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24760 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24770 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
24780 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
24790 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
247a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
247b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
247c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
247d0 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
247e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
247f0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
24800 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24810 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24820 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24830 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24840 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
24850 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24860 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
24870 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
24880 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
24890 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
248a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
248b0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
248c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
248d0 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
248e0 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
248f0 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
24900 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
24910 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24920 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
24930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24940 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24950 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
24960 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
24970 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
24980 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
24990 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
249a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
249b0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
249c0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
249d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
249e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
249f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24a00 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
24a10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24a20 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  e that evaluates
24a30 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
24a40 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
24a50 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
24a60 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24a70 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
24a80 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
24a90 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
24aa0 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
24ab0 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
24ac0 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
24ad0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
24ae0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
24af0 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
24b00 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
24b10 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
24b20 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
24b30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
24b40 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
24b50 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
24b60 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
24b70 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
24b80 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
24b90 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
24ba0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
24bb0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
24bc0 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69  e reused..*/.voi
24bd0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24be0 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
24bf0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24c00 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24c10 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
24c20 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24c30 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73  int iMem;..  ass
24c40 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
24c50 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
24c60 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
24c70 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  R );.  sqlite3Ex
24c80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
24c90 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24ca0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
24cb0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
24cc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24cd0 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20  P_Copy, target, 
24ce0 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52  iMem);.  exprToR
24cf0 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69  egister(pExpr, i
24d00 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mem);.}../*.** G
24d10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24d20 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
24d30 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
24d40 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
24d50 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
24d60 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
24d70 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
24d80 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
24d90 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
24da0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24db0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
24dc0 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ted.  The number
24dd0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a   returned will.*
24de0 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69  * usually be pLi
24df0 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69  st->nExpr but mi
24e00 67 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69  ght be reduced i
24e10 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  f SQLITE_ECEL_OM
24e20 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69  ITREF.** is defi
24e30 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ned..**.** The S
24e40 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
24e50 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
24e60 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
24e70 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
24e80 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
24e90 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
24ea0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
24eb0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
24ec0 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
24ed0 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
24ee0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
24ef0 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
24f00 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
24f10 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
24f20 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
24f30 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65  ECEL_REF flag me
24f40 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73  ans that express
24f50 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ions in the list
24f60 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73   with.** ExprLis
24f70 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  t.a[].u.x.iOrder
24f80 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72  ByCol>0 have alr
24f90 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61  eady been evalua
24fa0 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ted and stored.*
24fb0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61  * in registers a
24fc0 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f  t srcReg, and so
24fd0 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62   the value can b
24fe0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
24ff0 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ere..** If SQLIT
25000 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69  E_ECEL_OMITREF i
25010 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e  s also set, then
25020 20 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68   the values with
25030 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c   u.x.iOrderByCol
25040 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79  >0.** are simply
25050 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20   omitted rather 
25060 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65  than being copie
25070 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a  d from srcReg..*
25080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
25090 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
250a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
250b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
250c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
250d0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
250e0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
250f0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
25100 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
25110 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
25120 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
25130 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  lts */.  int src
25140 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
25150 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20  ource registers 
25160 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  if SQLITE_ECEL_R
25170 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73  EF */.  u8 flags
25180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
25190 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67  LITE_ECEL_* flag
251a0 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
251b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
251c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
251d0 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  j, n;.  u8 copyO
251e0 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
251f0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
25200 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
25210 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  py;.  Vdbe *v = 
25220 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
25230 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
25240 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
25250 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
25260 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
25270 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
25280 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
25290 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
252a0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
252b0 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
252c0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
252d0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
252e0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
252f0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
25300 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
25310 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
25320 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
25330 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69  pItem->pExpr;.#i
25340 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
25350 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
25360 4e 43 45 53 0a 20 20 20 20 69 66 28 20 70 49 74  NCES.    if( pIt
25370 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29  em->bSorterRef )
25380 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20  {.      i--;.   
25390 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73     n--;.    }els
253a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
253b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
253c0 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
253d0 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78   (j = pItem->u.x
253e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
253f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
25400 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25410 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20  _OMITREF ){.    
25420 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
25430 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   n--;.      }els
25440 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
25450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25460 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
25470 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
25480 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25490 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
254a0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
254b0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
254c0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
254d0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
254e0 70 45 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20  pExpr).    ){.  
254f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25500 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
25510 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
25520 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
25530 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
25540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25550 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
25560 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
25570 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
25580 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
25590 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
255a0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
255b0 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
255c0 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
255d0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
255e0 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
255f0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25600 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
25610 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
25620 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
25630 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
25640 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
25650 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
25660 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
25670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25690 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
256a0 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
256b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
256c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
256d0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
256e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
256f0 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
25700 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
25710 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
25720 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
25730 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
25740 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
25750 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
25760 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
25770 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
25780 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
25790 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
257a0 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
257b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
257c0 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
257d0 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
257e0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
25810 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
25820 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
25830 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
25840 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
25850 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
25860 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
25870 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
25880 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
25890 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
258a0 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
258b0 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
258c0 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
258d0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
258e0 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
258f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25900 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
25910 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
25920 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
25930 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
25940 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
25950 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
25960 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
25970 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
25980 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
25990 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
259a0 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
259b0 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
259c0 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
259d0 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
259e0 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
259f0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
25a00 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
25a10 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
25a20 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
25a30 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
25a40 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
25a50 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
25a60 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
25a70 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
25a80 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
25a90 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
25aa0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
25ab0 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
25ac0 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
25ad0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
25ae0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
25af0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
25b00 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65  egister */..  me
25b10 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
25b20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
25b30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
25b40 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
25b50 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25b60 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
25b70 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
25b80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
25b90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
25ba0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
25bb0 3b 0a 20 20 65 78 70 72 4e 6f 64 65 43 6f 70 79  ;.  exprNodeCopy
25bc0 28 26 65 78 70 72 58 2c 20 70 45 78 70 72 2d 3e  (&exprX, pExpr->
25bd0 70 4c 65 66 74 29 3b 0a 20 20 65 78 70 72 41 6e  pLeft);.  exprAn
25be0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
25bf0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
25c00 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
25c10 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
25c20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
25c30 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
25c40 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
25c50 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
25c60 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
25c70 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
25c80 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
25c90 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
25ca0 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
25cb0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
25cc0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
25cd0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
25ce0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
25cf0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
25d00 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
25d10 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
25d20 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
25d30 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
25d40 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
25d50 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
25d60 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25d70 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
25d80 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78    /* Mark the ex
25d90 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e  pression is bein
25da0 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  g from the ON or
25db0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
25dc0 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73   a join.    ** s
25dd0 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  o that the sqlit
25de0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
25df0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
25e00 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  not attempt to m
25e10 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  ove.    ** it in
25e20 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f  to the Parse.pCo
25e30 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57  nstExpr list.  W
25e40 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e  e should use a n
25e50 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c  ew bit for this,
25e60 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72  .    ** for clar
25e70 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20  ity, but we are 
25e80 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74  out of bits in t
25e90 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  he Expr.flags fi
25ea0 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a  eld so we.    **
25eb0 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74   have to reuse t
25ec0 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62  he EP_FromJoin b
25ed0 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a  it.  Bummer. */.
25ee0 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20      exprX.flags 
25ef0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
25f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25f10 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25f20 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
25f30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25f40 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
25f50 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
25f60 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
25f70 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
25f80 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
25f90 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25fa0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
25fb0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
25fc0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
25fd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25fe0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25ff0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
26000 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
26010 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26020 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26030 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26040 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26050 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26060 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26070 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26080 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
26090 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
260a0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
260b0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
260c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
260d0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
260e0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
260f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26100 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26110 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
26120 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
26130 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26140 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26150 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
26160 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
26170 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26180 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26190 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
261a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
261b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
261c0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
261d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
261e0 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mp==0 );.}../*.*
261f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
26200 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
26210 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
26220 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
26230 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
26240 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
26250 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
26260 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
26270 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
26280 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
26290 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
262a0 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
262b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
262c0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
262d0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
262e0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
262f0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
26300 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
26310 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
26320 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
26330 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
26340 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
26350 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
26360 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
26370 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
26380 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
26390 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
263a0 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
263b0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
263c0 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
263d0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
263e0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
263f0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
26400 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
26410 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
26420 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
26430 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
26440 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
26450 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
26460 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
26470 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
26480 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
26490 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
264a0 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
264b0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
264c0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
264d0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
264e0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
264f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
26500 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
26510 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
26520 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
26530 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
26540 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
26550 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
26560 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
26570 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26580 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
26590 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
265a0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
265b0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
265c0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
265d0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
265e0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
265f0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
26600 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
26610 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
26620 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
26630 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
26640 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
26650 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26660 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
26670 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26680 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26690 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
266a0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
266b0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
266c0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
266d0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
266e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
266f0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
26700 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
26710 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
26730 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
26740 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26750 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26760 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
26770 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26780 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26790 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
267a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
267b0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
267c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
267d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
267e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
267f0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
26800 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26820 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
26830 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26840 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26860 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26870 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26880 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26890 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
268a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
268b0 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
268c0 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
268d0 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
268e0 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
268f0 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
26900 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53  sTrue;     /* IS
26910 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
26920 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
26930 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26940 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
26950 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
26960 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
26970 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
26980 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
26990 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
269a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
269b0 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
269c0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
269d0 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
269e0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
269f0 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
26a00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
26a10 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
26a20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26a30 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
26a60 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
26a70 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
26a80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26a90 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26aa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26ab0 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49      isNot ? SQLI
26ae0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20  TE_JUMPIFNULL : 
26af0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
26b00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26b10 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
26b20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
26b30 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
26b40 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
26b50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
26b60 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
26b70 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
26b80 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
26b90 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
26ba0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
26bb0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26bc0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26bd0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26be0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26bf0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26c00 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26c10 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26c20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26c30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26c40 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26c50 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26c60 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26c70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26c80 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26c90 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26ca0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26cb0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26cc0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26cd0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26ce0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26cf0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26d00 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26d10 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26d20 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26d30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26d40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d60 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
26d70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26d80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
26d90 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
26da0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
26db0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26dc0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
26dd0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
26de0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
26df0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
26e00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26e10 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26e20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26e30 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26e40 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26e50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26e60 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
26e70 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
26e80 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26e90 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
26ea0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26eb0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
26ec0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
26ed0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26ee0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
26ef0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26f00 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26f10 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26f20 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26f30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26f40 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
26f50 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26f60 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
26f70 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
26f80 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
26f90 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
26fa0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26fb0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
26fc0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26fd0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26ff0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27000 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27010 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27020 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27030 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27040 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27050 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
27060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27070 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27090 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
270a0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
270b0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
270c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
270d0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
270e0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
270f0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
27100 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
27110 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
27120 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
27130 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27140 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27150 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27170 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
27180 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
27190 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
271a0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
271b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
271c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
271d0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
271e0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
271f0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27200 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27210 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
27220 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27230 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27240 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
27250 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
27260 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
27270 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27280 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
272a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
272b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
272c0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
272d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
272e0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
272f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
27300 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
27310 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
27320 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
27330 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
27340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27350 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27360 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
27370 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
27380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27390 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
273a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
273b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
273c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
273d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
273e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
273f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
27400 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
27410 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
27420 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
27430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27440 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
27450 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27460 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
27470 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
27480 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
27490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
274a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
274b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
274c0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
274d0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
274e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
274f0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
27500 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
27510 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
27520 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
27530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27540 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27550 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27560 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
27590 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
275a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
275b0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
275c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
275d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
275e0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
275f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
27600 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
27610 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
27620 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
27630 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
27640 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
27650 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
27660 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
27670 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
27680 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
27690 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
276a0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
276b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
276c0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
276d0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
276e0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
276f0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
27700 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
27710 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
27720 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
27730 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
27740 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27750 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
27760 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
27770 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
27780 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
27790 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
277a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
277b0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
277c0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
277d0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
277e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
277f0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
27800 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27810 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
27820 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27830 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
27840 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
27850 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
27860 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
27870 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
27880 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
27890 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
278a0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
278b0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
278c0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
278d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
278e0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
278f0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
27900 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
27910 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
27920 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
27930 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
27940 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
27950 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
27960 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
27970 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27990 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
279a0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
279b0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
279c0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
279d0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
279e0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
279f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
27a00 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27a20 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
27a30 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
27a40 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
27a50 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
27a60 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
27a70 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
27a80 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
27a90 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
27aa0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27ab0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27ac0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27ad0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27ae0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
27af0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
27b00 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
27b10 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
27b20 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
27b30 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
27b40 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
27b50 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
27b60 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
27b70 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
27b80 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
27b90 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
27ba0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27bb0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27bc0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27bd0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27be0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
27bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27c00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
27c10 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
27c20 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
27c30 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
27c40 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
27c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27c60 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
27c70 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
27c80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27c90 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
27ca0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
27cb0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27cc0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27ce0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
27cf0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
27d00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27d10 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
27d20 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
27d30 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
27d40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27d50 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27d60 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27d70 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27d80 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27d90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27da0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27db0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27dc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27de0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27df0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27e00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27e10 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
27e20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
27e30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
27e40 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
27e50 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27e60 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27e80 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
27e90 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
27ea0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
27eb0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
27ec0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27ed0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
27ee0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
27ef0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27f10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27f20 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
27f30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27f40 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
27f50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27f60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27f70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27f80 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27f90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27fa0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27fc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
27fd0 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
27fe0 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20   isNot;   /* IS 
27ff0 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
28000 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
28010 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f    int isTrue;  /
28020 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
28030 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
28040 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28050 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28060 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
28070 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
28080 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
28090 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
280a0 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
280b0 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
280c0 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
280d0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
280e0 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
280f0 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
28100 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
28110 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
28120 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20   /* IS TRUE and 
28130 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
28140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28150 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
28160 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28170 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
281a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
281b0 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
281c0 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41          /* IS FA
281d0 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54  LSE and IS NOT T
281e0 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  RUE */.        s
281f0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
28200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28210 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28240 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28250 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
28260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28270 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
28280 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
28290 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
282a0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
282b0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
282c0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
282d0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
282e0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
282f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
28300 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
28310 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
28320 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
28330 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
28340 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
28350 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
28360 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
28370 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
28380 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
28390 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
283a0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
283b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
283c0 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
283d0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
283e0 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
283f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28400 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28410 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28420 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28430 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28440 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28450 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
28460 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28470 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
28480 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
28490 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
284a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
284b0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
284c0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
284d0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
284e0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
284f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
28500 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
28510 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28520 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
28530 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
28540 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28550 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
28560 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28570 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
28580 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
28590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
285a0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
285b0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
285c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
285d0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
285e0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
285f0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
28600 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
28610 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28620 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
28630 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
28640 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
28650 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
28660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28670 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
28680 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
28690 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
286a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
286b0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
286c0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
286d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
286e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
286f0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
28700 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
28710 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28720 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
28730 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
28740 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
28750 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28760 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28770 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28780 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
28790 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
287a0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
287b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
287c0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
287d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
287e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
287f0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
28800 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
28810 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28820 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28830 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28840 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28860 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
28870 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
28880 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28890 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
288a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
288b0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
288c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
288d0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
288e0 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
288f0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
28900 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
28910 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
28920 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
28930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28940 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
28950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28960 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28970 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
28980 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
28990 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
289a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a  e3ExprIfFalse, j
289b0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
289c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
289d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
289e0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
289f0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
28a00 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
28a10 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
28a20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28a40 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
28a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28a60 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
28a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28a80 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
28a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28aa0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
28ab0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
28ac0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28ae0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
28af0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28b00 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28b10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28b20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
28b30 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
28b40 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
28b50 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
28b60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28b70 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
28b80 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
28b90 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
28ba0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
28bb0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
28bc0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
28bd0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
28be0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
28bf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28c00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28c20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
28c30 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
28c40 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
28c50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28c60 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
28c70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
28c80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
28c90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28ca0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28cb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
28cc0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
28cd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
28ce0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
28cf0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
28d00 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
28d10 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
28d20 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
28d30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28d40 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
28d50 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
28d60 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
28d70 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
28d80 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
28d90 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
28da0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
28db0 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
28dc0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
28dd0 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
28de0 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
28df0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28e00 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
28e10 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
28e20 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
28e30 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
28e40 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28e50 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
28e60 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
28e70 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
28e80 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
28e90 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
28ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28eb0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28ec0 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
28ed0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
28ee0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
28ef0 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
28f00 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
28f10 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
28f20 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
28f30 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
28f40 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
28f50 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
28f60 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
28f70 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
28f80 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
28f90 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
28fa0 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
28fb0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
28fc0 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
28fd0 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
28fe0 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
28ff0 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29000 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
29010 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
29020 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
29030 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
29040 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
29050 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29060 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29070 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29080 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29090 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
290a0 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
290b0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
290c0 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
290d0 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
290e0 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
290f0 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29100 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
29110 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
29120 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29130 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29140 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29150 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29160 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29170 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29180 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29190 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
291a0 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
291b0 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
291c0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
291d0 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
291e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
291f0 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29200 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
29210 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
29220 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
29230 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
29240 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
29250 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
29260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29270 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
29280 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
29290 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
292a0 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
292b0 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
292c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
292d0 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
292e0 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
292f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29300 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
29310 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
29320 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
29330 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
29340 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
29350 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
29360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29370 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
29380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
29390 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
293a0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
293b0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
293c0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
293d0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
293e0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
293f0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29400 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
29410 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
29420 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
29430 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
29440 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
29450 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
29460 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
29470 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
29480 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
29490 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
294a0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
294b0 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
294c0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
294d0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
294e0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
294f0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29500 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
29510 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
29520 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
29530 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
29540 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
29550 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
29560 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
29570 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
29580 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
29590 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
295a0 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
295b0 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
295c0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
295d0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
295e0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
295f0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
29600 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
29610 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
29620 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
29630 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
29640 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
29650 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
29660 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
29670 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
29680 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
29690 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
296a0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
296b0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
296c0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
296d0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
296e0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
296f0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29700 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
29710 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
29720 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
29730 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
29740 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
29750 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
29760 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
29770 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
29780 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
29790 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
297a0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
297b0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
297c0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
297d0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
297e0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
297f0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
29800 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
29810 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
29820 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
29830 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
29840 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
29850 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
29860 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
29870 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
29880 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
29890 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
298a0 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
298b0 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
298c0 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
298d0 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
298e0 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
298f0 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
29900 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
29910 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
29920 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
29930 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
29940 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
29950 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
29960 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
29970 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
29980 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
29990 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
299a0 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
299b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
299c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
299d0 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
299e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
299f0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
29a00 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
29a10 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
29a20 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
29a30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
29a40 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
29a50 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
29a60 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
29a70 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
29a80 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
29a90 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
29aa0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
29ab0 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
29ac0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
29ad0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
29ae0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
29af0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
29b00 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
29b10 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
29b20 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
29b30 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
29b40 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
29b50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
29b60 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
29b70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
29b80 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20 70  >op!=pB->op || p
29b90 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45 20  A->op==TK_RAISE 
29ba0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
29bb0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
29bc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29bd0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29be0 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c 32  pLeft,pB,iTab)<2
29bf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29c00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
29c10 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
29c20 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29c30 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29c40 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74 2c  e, pA,pB->pLeft,
29c50 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
29c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
29c70 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
29c80 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
29c90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
29ca0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
29cb0 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
29cc0 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
29cd0 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
29ce0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
29cf0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29d00 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29d10 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29d20 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65 66  eturn 2;.#ifndef
29d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
29d40 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 2f 2a  DOWFUNC.      /*
29d50 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   Justification f
29d60 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29 3a  or the assert():
29d70 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77  .      ** window
29d80 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
29d90 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
29da0 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74 65  ON but aggregate
29db0 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20   functions.     
29dc0 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d   ** have p->op==
29dd0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
29de0 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72 69    So any compari
29df0 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20 61  son between an a
29e00 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20 2a  ggregate.      *
29e10 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 61  * function and a
29e20 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
29e30 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69   should have fai
29e40 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61 63 68  led before reach
29e50 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
29e60 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20 69  s point.  And, i
29e70 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
29e80 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e 64  e to have a wind
29e90 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  ow function and.
29ea0 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61 6c 61        ** a scala
29eb0 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  r function with 
29ec0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 6e  the same name an
29ed0 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  d number of argu
29ee0 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20 20  ments.  So.     
29ef0 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68 20   ** if we reach 
29f00 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68  this point, eith
29f10 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20  er A and B both 
29f20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
29f30 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e 65 69   or.      ** nei
29f40 74 68 65 72 20 61 72 65 20 61 20 77 69 6e 64 6f  ther are a windo
29f50 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a  w functions. */.
29f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
29f70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
29f80 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d 45 78  ,EP_WinFunc)==Ex
29f90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
29fa0 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a  ,EP_WinFunc) );.
29fb0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
29fc0 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f  sProperty(pA,EP_
29fd0 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
29fe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
29ff0 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50 61  indowCompare(pPa
2a000 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e 2c 70  rse,pA->y.pWin,p
2a010 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20 29 20  B->y.pWin)!=0 ) 
2a020 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
2a030 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
2a040 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54  se if( pA->op==T
2a050 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  K_NULL ){.      
2a060 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
2a070 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
2a080 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
2a090 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a0a0 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54  stricmp(pA->u.zT
2a0b0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
2a0c0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
2a0d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a0e0 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e 7a 54 6f  ALWAYS(pB->u.zTo
2a0f0 6b 65 6e 21 3d 30 29 20 26 26 20 73 74 72 63 6d  ken!=0) && strcm
2a100 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2a110 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2a120 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a130 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2a140 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
2a150 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
2a160 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
2a170 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
2a180 20 32 3b 0a 20 20 69 66 28 20 28 63 6f 6d 62 69   2;.  if( (combi
2a190 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f  nedFlags & EP_To
2a1a0 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20  kenOnly)==0 ){. 
2a1b0 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
2a1c0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
2a1d0 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
2a1e0 20 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65      if( (combine
2a1f0 64 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65  dFlags & EP_Fixe
2a200 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  dCol)==0.     &&
2a210 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a220 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a230 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
2a240 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2a250 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a260 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a270 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68  Parse, pA->pRigh
2a280 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
2a290 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
2a2a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a2b0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2a2c0 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
2a2d0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
2a2e0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a2f0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53  if( pA->op!=TK_S
2a300 54 52 49 4e 47 0a 20 20 20 20 20 26 26 20 70 41  TRING.     && pA
2a310 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op!=TK_TRUEFAL
2a320 53 45 0a 20 20 20 20 20 26 26 20 28 63 6f 6d 62  SE.     && (comb
2a330 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2a340 65 64 75 63 65 64 29 3d 3d 30 0a 20 20 20 20 29  educed)==0.    )
2a350 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
2a360 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
2a370 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
2a380 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
2a390 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
2a3a0 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
2a3b0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
2a3c0 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
2a3d0 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
2a3e0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
2a3f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2a400 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
2a410 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
2a420 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
2a430 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
2a440 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
2a450 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
2a460 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
2a470 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
2a480 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
2a490 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
2a4a0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
2a4b0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
2a4c0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
2a4d0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
2a4e0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
2a4f0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
2a500 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a510 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
2a520 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
2a530 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
2a540 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
2a550 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
2a560 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
2a570 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
2a580 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a590 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
2a5a0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
2a5b0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
2a5c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
2a5d0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
2a5e0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
2a5f0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
2a600 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
2a610 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
2a620 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
2a630 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
2a640 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
2a650 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
2a660 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
2a670 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2a680 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
2a690 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
2a6a0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
2a6b0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
2a6c0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
2a6d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
2a6e0 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
2a6f0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
2a700 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
2a710 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
2a720 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
2a730 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
2a740 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
2a750 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2a760 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
2a770 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
2a780 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
2a790 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
2a7a0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
2a7b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2a7c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a7d0 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 41  ompare(0, pExprA
2a7e0 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
2a7f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
2a800 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a810 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
2a820 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65  3ExprCompare() e
2a830 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70  xcept COLLATE op
2a840 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20 74  erators at the t
2a850 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20  op-level.** are 
2a860 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
2a870 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a880 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c  reSkip(Expr *pA,
2a890 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
2a8a0 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
2a8b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a8c0 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e(0,.           
2a8d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
2a8e0 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20  pCollate(pA),.  
2a8f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a900 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2a910 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20  e(pB),.         
2a920 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a      iTab);.}../*
2a930 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2a940 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
2a950 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
2a960 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
2a970 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
2a980 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2a990 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
2a9a0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
2a9b0 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
2a9c0 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
2a9d0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
2a9e0 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
2a9f0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2aa00 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2aa10 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
2aa20 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
2aa30 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
2aa40 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2aa50 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
2aa60 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
2aa70 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
2aa80 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2aa90 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
2aaa0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2aab0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2aac0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
2aad0 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
2aae0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2aaf0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2ab00 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
2ab10 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2ab20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2ab30 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
2ab40 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
2ab50 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2ab60 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
2ab70 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
2ab80 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
2ab90 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
2aba0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
2abb0 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
2abc0 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
2abd0 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
2abe0 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
2abf0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
2ac00 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2ac10 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  en the values of
2ac20 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2ac30 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20   in pE1 are .** 
2ac40 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74  compared against
2ac50 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20   literal values 
2ac60 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72 73  in pE2 and pPars
2ac70 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
2ac80 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64  k is.** modified
2ac90 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68   to record which
2aca0 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
2acb0 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e   are referenced.
2acc0 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20    If pParse .** 
2acd0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61  is NULL, then fa
2ace0 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  lse will be retu
2acf0 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74  rned if pE1 cont
2ad00 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76  ains any bound v
2ad10 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
2ad20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
2ad30 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
2ad40 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
2ad50 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
2ad60 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
2ad70 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
2ad80 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
2ad90 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
2ada0 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
2adb0 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
2adc0 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
2add0 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
2ade0 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
2adf0 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
2ae00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
2ae10 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2ae20 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
2ae30 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29   *pE2, int iTab)
2ae40 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  {.  if( sqlite3E
2ae50 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2ae60 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61  e, pE1, pE2, iTa
2ae70 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
2ae80 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2ae90 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
2aea0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
2aeb0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2aec0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2aed0 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20  pLeft, iTab).   
2aee0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2aef0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2af00 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2af10 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
2af20 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
2af30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2af40 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
2af50 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  OTNULL && pE1->o
2af60 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
2af70 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29  pE1->op!=TK_IS )
2af80 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
2af90 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2afa0 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65  Collate(pE1->pLe
2afb0 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ft);.    testcas
2afc0 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66  e( pX!=pE1->pLef
2afd0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  t );.    if( sql
2afe0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2aff0 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45 32 2d  pParse, pX, pE2-
2b000 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
2b010 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2b020 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2b030 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
2b040 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61 6c 6c  e Expr node call
2b050 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33  back for sqlite3
2b060 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  ExprImpliesNotNu
2b070 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66 20 74  llRow()..** If t
2b080 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
2b090 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  de requires that
2b0a0 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 70 57   the table at pW
2b0b0 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a 20 68  alker->iCur.** h
2b0c0 61 76 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ave one or more 
2b0d0 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c  non-NULL column,
2b0e0 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65   then set pWalke
2b0f0 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 61 6e  r->eCode to 1 an
2b100 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54  d abort..**.** T
2b110 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 74  his routine cont
2b120 72 6f 6c 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  rols an optimiza
2b130 74 69 6f 6e 2e 20 20 46 61 6c 73 65 20 70 6f 73  tion.  False pos
2b140 69 74 69 76 65 73 20 28 73 65 74 74 69 6e 67 0a  itives (setting.
2b150 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  ** pWalker->eCod
2b160 65 20 74 6f 20 31 20 77 68 65 6e 20 69 74 20 73  e to 1 when it s
2b170 68 6f 75 6c 64 20 6e 6f 74 20 62 65 29 20 61 72  hould not be) ar
2b180 65 20 64 65 61 64 6c 79 2c 20 62 75 74 20 66 61  e deadly, but fa
2b190 6c 73 65 2d 6e 65 67 61 74 69 76 65 73 0a 2a 2a  lse-negatives.**
2b1a0 20 28 6e 65 76 65 72 20 73 65 74 74 69 6e 67 20   (never setting 
2b1b0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 29 20  pWalker->eCode) 
2b1c0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6d 69  is a harmless mi
2b1d0 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ssed optimizatio
2b1e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2b1f0 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2b200 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ow(Walker *pWalk
2b210 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2b220 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  {.  testcase( pE
2b230 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2b240 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74  COLUMN );.  test
2b250 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b260 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2b270 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   );.  if( ExprHa
2b280 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2b290 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
2b2a0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b2b0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
2b2c0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
2b2d0 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
2b2e0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20  case TK_NOT:.   
2b2f0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
2b300 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
2b310 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
2b320 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
2b330 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
2b340 4b 5f 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65  K_CASE:.    case
2b350 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
2b360 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
2b370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b380 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
2b390 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b3a0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b3b0 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
2b3c0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b3d0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
2b3e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b3f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b400 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
2b410 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b420 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
2b430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b440 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
2b450 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b460 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b470 5f 43 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74  _CASE );.      t
2b480 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b490 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
2b4a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b4b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
2b4c0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ION );.      ret
2b4d0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b4e0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
2b4f0 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
2b500 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45  lker->u.iCur==pE
2b510 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20  xpr->iTable ){. 
2b520 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2b530 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  eCode = 1;.     
2b540 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b550 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
2b560 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2b570 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72  une;..    /* Vir
2b580 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20  tual tables are 
2b590 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63  allowed to use c
2b5a0 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20  onstraints like 
2b5b0 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20  x=NULL.  So.    
2b5c0 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ** a term of the
2b5d0 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e   form x=y does n
2b5e0 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 79 20  ot prove that y 
2b5f0 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78  is not null if x
2b600 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2b610 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75  olumn of a virtu
2b620 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
2b630 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
2b640 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
2b650 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
2b660 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
2b670 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
2b680 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
2b690 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b6a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  r->op==TK_EQ );.
2b6b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b6c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
2b6d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b6e0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b6f0 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
2b700 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b710 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
2b720 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b730 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  r->op==TK_GT );.
2b740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b750 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  pExpr->op==TK_GE
2b760 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
2b770 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
2b780 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2b790 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70  Virtual(pExpr->p
2b7a0 4c 65 66 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20  Left->y.pTab)). 
2b7b0 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d        || (pExpr-
2b7c0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
2b7d0 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
2b7e0 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ual(pExpr->pRigh
2b7f0 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20  t->y.pTab)).    
2b800 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75    ){.       retu
2b810 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b820 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
2b830 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2b840 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2b850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2b860 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
2b870 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  ) if expression 
2b880 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72  p can only be tr
2b890 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a  ue if at least.*
2b8a0 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * one column of 
2b8b0 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f  table iTab is no
2b8c0 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65  n-null.  In othe
2b8d0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2b8e0 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65  true.** if expre
2b8f0 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77  ssion p will alw
2b900 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66  ays be NULL or f
2b910 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f  alse if every co
2b920 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2b930 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46  is NULL..**.** F
2b940 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61  alse negatives a
2b950 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20  re acceptable.  
2b960 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2b970 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75  it is ok to retu
2b980 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20  rn.** zero even 
2b990 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2b9a0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
2b9b0 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75  ue of every colu
2b9c0 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2b9d0 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20   NULL.  A false 
2b9e0 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65  negative is mere
2b9f0 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69  ly a missed opti
2ba00 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75  mization opportu
2ba10 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  nity..**.** Fals
2ba20 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20  e positives are 
2ba30 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77  not allowed, how
2ba40 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70  ever.  A false p
2ba50 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75  ositive may resu
2ba60 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f  lt.** in an inco
2ba70 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a  rrect answer..**
2ba80 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74  .** Terms of p t
2ba90 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77  hat are marked w
2baa0 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  ith EP_FromJoin 
2bab0 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20  (and hence that 
2bac0 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  come from.** the
2bad0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2bae0 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49  uses of LEFT JOI
2baf0 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64  NS) are excluded
2bb00 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73   from the analys
2bb10 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  is..**.** This r
2bb20 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
2bb30 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46  o check if a LEF
2bb40 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f  T JOIN can be co
2bb50 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20  nverted into.** 
2bb60 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
2bb70 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e  .  The p argumen
2bb80 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63  t is the WHERE c
2bb90 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57  lause.  If the W
2bba0 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72  HERE.** clause r
2bbb0 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d  equires that som
2bbc0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
2bbd0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74  right table of t
2bbe0 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20  he LEFT JOIN.** 
2bbf0 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  be non-NULL, the
2bc00 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  n the LEFT JOIN 
2bc10 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f  can be safely co
2bc20 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a  nverted into an.
2bc30 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e  ** ordinary join
2bc40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bc50 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
2bc60 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69  llRow(Expr *p, i
2bc70 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b  nt iTab){.  Walk
2bc80 65 72 20 77 3b 0a 20 20 70 20 3d 20 73 71 6c 69  er w;.  p = sqli
2bc90 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2bca0 74 65 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20  te(p);.  while( 
2bcb0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2bcc0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
2bcd0 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70  {.      p = p->p
2bce0 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Left;.    }else 
2bcf0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  if( p->op==TK_AN
2bd00 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  D ){.      if( s
2bd10 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2bd20 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70  sNonNullRow(p->p
2bd30 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
2bd40 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 20  turn 1;.      p 
2bd50 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  = p->pRight;.   
2bd60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
2bd70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2bd80 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2bd90 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c   = impliesNotNul
2bda0 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  lRow;.  w.xSelec
2bdb0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
2bdc0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2bdd0 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f  ck2 = 0;.  w.eCo
2bde0 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43  de = 0;.  w.u.iC
2bdf0 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c  ur = iTab;.  sql
2be00 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2be10 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
2be20 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
2be30 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2be40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2be50 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
2be60 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
2be70 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  r.** to determin
2be80 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  e if an expressi
2be90 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  on can be evalua
2bea0 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65  ted by reference
2beb0 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78   to the.** index
2bec0 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68   only, without h
2bed0 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65  aving to do a se
2bee0 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72  arch for the cor
2bef0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
2bf00 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ble entry.  The 
2bf10 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69  IdxCover.pIdx fi
2bf20 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78  eld is the index
2bf30 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72  .  IdxCover.iCur
2bf40 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f  .** is the curso
2bf50 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  r for the table.
2bf60 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f  .*/.struct IdxCo
2bf70 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ver {.  Index *p
2bf80 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
2bf90 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2bfa0 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
2bfb0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
2bfc0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2bfd0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
2bfe0 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  able correspondi
2bff0 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ng to the index 
2c000 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
2c010 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2c020 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  re are reference
2c030 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2c040 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65  table .** pWalke
2c050 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2c060 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69  iCur can be sati
2c070 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  sfied using the 
2c080 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72  index.** pWalker
2c090 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2c0a0 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Idx..*/.static i
2c0b0 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28  nt exprIdxCover(
2c0c0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c0d0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2c0e0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
2c0f0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
2c100 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2c110 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2c120 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20  ver->iCur.   && 
2c130 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
2c140 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e  ndex(pWalker->u.
2c150 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c  pIdxCover->pIdx,
2c160 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
2c170 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  <0.  ){.    pWal
2c180 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2c190 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2c1a0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bort;.  }.  retu
2c1b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2c1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2c1d0 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20  ine if an index 
2c1e0 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69  pIdx on table wi
2c1f0 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63  th cursor iCur c
2c200 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20  ontains will.** 
2c210 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
2c220 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72  Expr.  Return tr
2c230 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ue if the index 
2c240 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a  does cover the.*
2c250 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2c260 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45   false if the pE
2c270 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72  xpr expression r
2c280 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20  eferences table 
2c290 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20  columns.** that 
2c2a0 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  are not found in
2c2b0 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e   the index pIdx.
2c2c0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20  .**.** An index 
2c2d0 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72  covering an expr
2c2e0 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  ession means tha
2c2f0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2c300 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75   can be.** evalu
2c310 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20  ated using only 
2c320 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69  the index and wi
2c330 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2c340 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f  lookup the.** co
2c350 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2c360 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20  e entry..*/.int 
2c370 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72  sqlite3ExprCover
2c380 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70  edByIndex(.  Exp
2c390 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
2c3a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2c3b0 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20   be tested */.  
2c3c0 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
2c3d0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2c3e0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
2c3f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2c400 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  able */.  Index 
2c410 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
2c420 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
2c430 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f  might be used fo
2c440 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b  r coverage */.){
2c450 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2c460 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78  truct IdxCover x
2c470 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  cov;.  memset(&w
2c480 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
2c490 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69  .  xcov.iCur = i
2c4a0 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78  Cur;.  xcov.pIdx
2c4b0 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78   = pIdx;.  w.xEx
2c4c0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
2c4d0 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75  rIdxCover;.  w.u
2c4e0 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63  .pIdxCover = &xc
2c4f0 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ov;.  sqlite3Wal
2c500 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2c510 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43  ;.  return !w.eC
2c520 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ode;.}.../*.** A
2c530 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2c540 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2c550 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
2c560 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
2c570 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66  .** to count ref
2c580 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
2c590 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2c5a0 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20  arguments of an 
2c5b0 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
2c5c0 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72  nction, in order
2c5d0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2c5e0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63  e.** sqlite3Func
2c5f0 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f  tionThisSrc() ro
2c600 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
2c610 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72   SrcCount {.  Sr
2c620 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f  cList *pSrc;   /
2c630 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72  * One particular
2c640 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
2c650 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a  a nested query *
2c660 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20  /.  int nThis;  
2c670 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c680 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2c690 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c  columns in pSrcL
2c6a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74  ist */.  int nOt
2c6b0 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  her;      /* Num
2c6c0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2c6d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
2c6e0 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
2c6f0 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
2c700 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
2c710 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2c720 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74  o columns..*/.st
2c730 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63  atic int exprSrc
2c740 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  Count(Walker *pW
2c750 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2c760 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45  pr){.  /* The NE
2c770 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63  VER() on the sec
2c780 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61  ond term is beca
2c790 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74  use sqlite3Funct
2c7a0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2c7b0 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
2c7c0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71  called before sq
2c7d0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2c7e0 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64  Aggregates() and
2c7f0 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f   so the.  ** TK_
2c800 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74  COLUMNs have not
2c810 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72   yet been conver
2c820 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  ted into TK_AGG_
2c830 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a  COLUMN.  If.  **
2c840 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2c850 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73  UsesThisSrc() is
2c860 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c   used differentl
2c870 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  y in the future,
2c880 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28   the.  ** NEVER(
2c890 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  ) will need to b
2c8a0 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  e removed. */.  
2c8b0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
2c8c0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45  K_COLUMN || NEVE
2c8d0 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  R(pExpr->op==TK_
2c8e0 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20  AGG_COLUMN) ){. 
2c8f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
2c900 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70  ruct SrcCount *p
2c910 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2c920 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63  rcCount;.    Src
2c930 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
2c940 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pSrc;.    int nS
2c950 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63  rc = pSrc ? pSrc
2c960 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20  ->nSrc : 0;.    
2c970 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b  for(i=0; i<nSrc;
2c980 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2c990 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2c9a0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
2c9b0 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
2c9c0 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63  }.    if( i<nSrc
2c9d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
2c9e0 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
2c9f0 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
2ca00 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
2ca10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2ca20 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2ca30 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
2ca40 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
2ca50 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
2ca60 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
2ca70 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
2ca80 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2ca90 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
2caa0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
2cab0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
2cac0 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
2cad0 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
2cae0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
2caf0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
2cb00 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
2cb10 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
2cb20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
2cb30 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
2cb40 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
2cb50 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2cb60 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
2cb70 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
2cb80 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
2cb90 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
2cba0 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
2cbb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
2cbc0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2cbd0 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   );.  w.xExprCal
2cbe0 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
2cbf0 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  ount;.  w.xSelec
2cc00 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
2cc10 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
2cc20 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
2cc30 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
2cc40 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
2cc50 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
2cc60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2cc70 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
2cc80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
2cc90 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
2cca0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
2ccb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
2ccc0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2ccd0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2cce0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
2ccf0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2cd00 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2cd10 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2cd20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2cd30 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2cd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2cd50 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2cd60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2cd70 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2cd80 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2cd90 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
2cda0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2cdb0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
2cdc0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
2cdd0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
2cde0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
2cdf0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
2ce00 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
2ce10 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2ce20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
2ce30 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
2ce40 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
2ce50 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
2ce60 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2ce70 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
2ce80 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
2ce90 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2cea0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2ceb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2cec0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
2ced0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
2cee0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
2cef0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
2cf00 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
2cf10 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
2cf20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
2cf30 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
2cf40 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2cf50 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
2cf60 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
2cf70 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
2cf80 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
2cf90 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
2cfa0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
2cfb0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
2cfc0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
2cfd0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
2cfe0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
2cff0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2d000 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
2d010 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2d020 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
2d030 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2d040 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2d050 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2d060 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
2d070 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2d080 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
2d090 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
2d0a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
2d0b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2d0c0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
2d0d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
2d0e0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
2d0f0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
2d100 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
2d110 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  uNC.pAggInfo;.. 
2d120 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63   assert( pNC->nc
2d130 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67 67 49  Flags & NC_UAggI
2d140 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63 68 28  nfo );.  switch(
2d150 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
2d160 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
2d170 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
2d180 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
2d190 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2d1a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
2d1b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
2d1c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2d1d0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
2d1e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2d1f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
2d200 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
2d210 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2d220 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
2d230 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2d240 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2d250 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
2d260 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
2d270 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
2d280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2d290 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
2d2a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
2d2b0 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
2d2c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
2d2d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2d2e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2d2f0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
2d300 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2d310 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2d320 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
2d330 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2d340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d350 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2d360 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
2d370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d380 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2d390 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
2d3a0 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
2d3b0 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
2d3c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
2d3d0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
2d3e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2d3f0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
2d400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
2d410 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
2d420 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
2d430 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
2d440 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2d450 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
2d460 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
2d470 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
2d480 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
2d490 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2d4a0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
2d4b0 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
2d4c0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
2d4d0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
2d4e0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
2d4f0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
2d500 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2d510 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
2d520 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2d530 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2d540 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2d550 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2d560 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2d570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2d590 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
2d5b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
2d5c0 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
2d5d0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
2d5e0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
2d5f0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
2d600 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2d610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d620 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
2d630 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
2d640 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2d650 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79  >pTab = pExpr->y
2d660 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
2d670 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
2d680 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
2d690 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2d6a0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
2d6b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
2d6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d6d0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
2d6e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2d6f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d700 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2d710 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2d720 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
2d730 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2d740 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
2d750 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2d770 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
2d780 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
2d790 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
2d7a0 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2d7c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2d7d0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
2d7e0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
2d7f0 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
2d800 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2d810 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2d820 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
2d850 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2d870 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
2d880 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
2d890 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2d8a0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
2d8b0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
2d8c0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2d8d0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2d8f0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2d900 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
2d910 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d930 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d960 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2d970 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
2d980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d990 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2d9a0 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
2d9b0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
2d9c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
2d9d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2d9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2d9f0 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
2da00 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
2da10 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2da20 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
2da30 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
2da40 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
2da50 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
2da60 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
2da70 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
2da80 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
2da90 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
2daa0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
2dab0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2dad0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2dae0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
2daf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2db00 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2db10 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2db20 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2db30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2db40 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2db50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2db60 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
2db70 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2db80 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2db90 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
2dba0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dbb0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2dbc0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
2dbd0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2dbe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
2dbf0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
2dc00 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
2dc10 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2dc20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
2dc30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2dc40 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
2dc50 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
2dc60 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
2dc70 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
2dc80 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
2dc90 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
2dca0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
2dcb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2dcc0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
2dcd0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
2dce0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
2dcf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
2dd00 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
2dd10 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
2dd20 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
2dd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2dd40 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2dd50 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
2dd60 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2dd70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2dd80 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2dd90 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
2dda0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2ddb0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2ddc0 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70  pare(0, pItem->p
2ddd0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
2dde0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ddf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2de00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2de10 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
2de20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
2de30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
2de40 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
2de50 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
2de60 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
2de70 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
2de80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2de90 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
2dea0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
2deb0 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
2dec0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
2ded0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
2dee0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
2def0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2df00 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2df10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2df20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2df30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2df40 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
2df50 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
2df60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
2df70 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2df80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2df90 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2dfa0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2dfb0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2dfc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2dfd0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2dff0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
2e000 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
2e010 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e030 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2e040 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2e050 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
2e060 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
2e070 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
2e080 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
2e090 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2e0a0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2e0b0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
2e0c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2e0d0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
2e0e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2e0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e100 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e110 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2e120 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2e150 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
2e160 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
2e170 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
2e180 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
2e190 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2e1a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2e1b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2e1c0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2e1d0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
2e1e0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2e1f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2e200 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2e210 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2e220 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
2e230 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2e240 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2e250 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e260 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
2e270 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
2e280 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2e290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e2a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2e2b0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2e2c0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2e2d0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2e2e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2e2f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2e300 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2e310 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2e320 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2e330 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74  erDepth++;.  ret
2e340 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2e350 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2e360 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e370 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c  sInSelectEnd(Wal
2e380 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2e390 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2e3a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e3b0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2e3c0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2e3d0 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pth--;.}../*.** 
2e3e0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
2e3f0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
2e400 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
2e410 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2e420 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
2e430 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2e440 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
2e450 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
2e460 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
2e470 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
2e480 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
2e490 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
2e4a0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
2e4b0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
2e4c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e4d0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2e4e0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
2e4f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
2e500 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
2e510 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
2e520 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
2e530 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2e540 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2e550 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
2e560 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
2e570 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
2e580 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2e590 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2e5a0 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
2e5b0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
2e5c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2e5d0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c  Select;.  w.xSel
2e5e0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61  ectCallback2 = a
2e5f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2e600 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77  InSelectEnd;.  w
2e610 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30  .walkerDepth = 0
2e620 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
2e630 43 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  C;.  w.pParse = 
2e640 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  0;.  assert( pNC
2e650 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
2e660 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2e670 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
2e680 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
2e690 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e6a0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
2e6b0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
2e6c0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
2e6d0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
2e6e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2e6f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
2e700 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
2e710 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
2e720 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
2e730 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2e740 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2e750 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
2e760 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
2e770 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
2e780 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2e790 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
2e7a0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2e7b0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
2e7c0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
2e7d0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
2e7e0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
2e7f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2e800 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
2e810 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2e820 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2e830 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
2e840 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
2e850 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
2e860 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
2e870 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
2e880 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2e890 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2e8a0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2e8b0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
2e8c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
2e8d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
2e8e0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2e8f0 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
2e900 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
2e910 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2e920 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
2e930 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
2e940 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
2e950 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
2e960 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pose..*/.void sq
2e970 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2e980 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2e990 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
2e9a0 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
2e9b0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
2e9c0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
2e9d0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
2e9e0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2e9f0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
2ea00 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
2ea10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2ea20 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
2ea30 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
2ea40 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
2ea50 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  isters..*/.int s
2ea60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2ea70 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2ea80 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2ea90 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e  nt i, n;.  if( n
2eaa0 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20  Reg==1 ) return 
2eab0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2eac0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d  g(pParse);.  i =
2ead0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2eae0 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
2eaf0 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
2eb00 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
2eb10 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2eb20 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
2eb30 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2eb40 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
2eb50 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
2eb60 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2eb70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2eb80 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
2eb90 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
2eba0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2ebb0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2ebc0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
2ebd0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
2ebe0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73  nReg==1 ){.    s
2ebf0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ec00 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2ec10 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  g);.    return;.
2ec20 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 67 3e 70    }.  if( nReg>p
2ec30 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2ec40 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2ec50 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
2ec60 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
2ec70 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
2ec80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2ec90 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
2eca0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
2ecb0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
2ecc0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
2ecd0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
2ece0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
2ecf0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
2ed00 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
2ed10 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
2ed20 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
2ed30 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
2ed40 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
2ed50 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
2ed60 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2ed70 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
2ed80 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
2ed90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2eda0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
2edb0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
2edc0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
2edd0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2ede0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2edf0 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
2ee00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2ee10 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
2ee20 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
2ee30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
2ee40 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
2ee50 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2ee60 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
2ee70 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20  Reg > iFirst.   
2ee80 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2ee90 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20  eReg <= iLast.  
2eea0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
2eeb0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2eec0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
2eed0 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Reg; i++){.    i
2eee0 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  f( pParse->aTemp
2eef0 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26  Reg[i]>=iFirst &
2ef00 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  & pParse->aTempR
2ef10 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a  eg[i]<=iLast ){.
2ef20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2ef30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ef40 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2ef50 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
2ef60 2f 0a                                            /.