/ Hex Artifact Content
Login

Artifact a0cf3628dd46cebd877b4d22e6c6a828ae9b79b7bf3432501c1ddd0a351d150b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f      if( (op==TK_
1230: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
1240: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1250: 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f        || op==TK_
1260: 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d  REGISTER || op==
1270: 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  TK_TRIGGER).    
1280: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
1290: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
12a0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
12b0: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
12c0: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45   happens when pE
12d0: 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  xpr was original
12e0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b  ly.      ** a TK
12f0: 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20  _COLUMN but was 
1300: 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75  previously evalu
1310: 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20  ated and cached 
1320: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  in a register */
1330: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1340: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1350: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1360: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1370: 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 79 2e 70 54  *zColl = p->y.pT
1380: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1390: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
13a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
13b0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
13c0: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
13d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13f0: 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20   op==TK_CAST || 
1400: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op==TK_UPLUS ){.
1410: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
1420: 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ft;.      contin
1430: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1440: 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ( op==TK_COLLATE
1450: 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49   || (op==TK_REGI
1460: 53 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d  STER && p->op2==
1470: 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20  TK_COLLATE) ){. 
1480: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1490: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
14a0: 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20  Parse, ENC(db), 
14b0: 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  0, p->u.zToken);
14c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
14e0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
14f0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
1500: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1510: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1520: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1530: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1540: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1550: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1560: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1570: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1580: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1590: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
15a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
15b0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
15c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
15d0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
15e0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
15f0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
1600: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1610: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1620: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1630: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1640: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1650: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1660: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1670: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1680: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1690: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
16a0: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
16b0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
16c0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
16d0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
16e0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
16f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
1700: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1710: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1720: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1730: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1740: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1750: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1760: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1770: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1780: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1790: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
17b0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
17c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
17f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1810: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1820: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1840: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1850: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1860: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1880: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1890: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ll;.}../*.** Ret
18a0: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  urn the collatio
18b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
18c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
18d0: 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65  xpr. If.** there
18e0: 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63   is no defined c
18f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1900: 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
1910: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65  ter to the.** de
1920: 66 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20  fautl collation 
1930: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
1940: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
1950: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a  3ExprCollSeq().*
1960: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1970: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f  ExprCollSeq() ro
1980: 75 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20  utine works the 
1990: 73 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74  same except that
19a0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e   it.** returns N
19b0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
19c0: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
19d0: 74 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  tion..*/.CollSeq
19e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43   *sqlite3ExprNNC
19f0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
1a00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a10: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
1a20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
1a40: 78 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  xpr);.  if( p==0
1a50: 20 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64   ) p = pParse->d
1a60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1a70: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1a80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1a90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1aa0: 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1ab0: 65 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75  essions have equ
1ac0: 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  ivalent collatin
1ad0: 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a  g sequences..*/.
1ae0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1af0: 6f 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73  ollSeqMatch(Pars
1b00: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b10: 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29  *pE1, Expr *pE2)
1b20: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1b30: 6c 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll1 = sqlite3Exp
1b40: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1b50: 65 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53  e, pE1);.  CollS
1b60: 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c  eq *pColl2 = sql
1b70: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1b80: 71 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  q(pParse, pE2);.
1b90: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ba0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e  StrICmp(pColl1->
1bb0: 7a 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a  zName, pColl2->z
1bc0: 4e 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Name)==0;.}../*.
1bd0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
1be0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
1bf0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c00: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
1c10: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
1c20: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
1c30: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1c40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
1c50: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
1c60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
1c70: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
1c80: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c90: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
1ca0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1cc0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
1cd0: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
1ce0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
1cf0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
1d00: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
1d10: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
1d20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
1d30: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
1d40: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
1d50: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
1d60: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
1d70: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
1d80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1d90: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
1da0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
1db0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
1dc0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
1dd0: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
1de0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
1df0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
1e00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e10: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1e30: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
1e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
1e50: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
1e60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
1e70: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
1e80: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
1e90: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
1ea0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1eb0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ed0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
1ee0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
1ef0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
1f00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
1f10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1f20: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
1f30: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1f40: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
1f50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
1f60: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
1f70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
1f80: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
1f90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
1fa0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
1fb0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
1fc0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
1fd0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
1fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1ff0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
2000: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
2010: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
2020: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2030: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
2040: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
2050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2060: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
2070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
2080: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2090: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
20a0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
20b0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
20c0: 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_NE || pExpr->o
20d0: 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70  p==TK_IS || pExp
20e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
20f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
2100: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61  pr->pLeft );.  a
2110: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
2120: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
2130: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45  pLeft);.  if( pE
2140: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
2150: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
2160: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
2170: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
2180: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
2190: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21a0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
21b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66  lect) ){.    aff
21c0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
21d0: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
21e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
21f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
2200: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
2210: 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( aff==0 ){.    
2220: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
2230: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
2240: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2250: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
2260: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
2270: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
2280: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
2290: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
22a0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
22b0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
22c0: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
22d0: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
22e0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
22f0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
2300: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2310: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
2320: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
2330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
2340: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
2350: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
2360: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
2370: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
2380: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
2390: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
23a0: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
23b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
23c0: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
23d0: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
23e0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
23f0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
2400: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2410: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
2420: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
2430: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
2440: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
2450: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
2460: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2470: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
2480: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2490: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
24a0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
24b0: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
24c0: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
24d0: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
24e0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
24f0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
2500: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
2510: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
2520: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
2530: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
2540: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
2550: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
2560: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
2570: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2580: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
2590: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
25a0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
25e0: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
25f0: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
2600: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
2610: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
2620: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
2630: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
2640: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
2650: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
2660: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2670: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
2680: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
2690: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
26a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
26b0: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
26c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
26d0: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
26e0: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
26f0: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
2700: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
2710: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
2720: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
2730: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
2740: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
2750: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
2760: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
2770: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
2780: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
2790: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
27a0: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
27b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
27c0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
27d0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
27e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
27f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
2800: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
2810: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
2820: 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  late ){.    pCol
2830: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2850: 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Left);.  }else i
2860: 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52  f( pRight && (pR
2870: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
2880: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
2890: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
28a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
28b0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
28c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
28d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
28f0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
2900: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2910: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2920: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2930: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
2940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2950: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
2960: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2970: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
2980: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
2990: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
29a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
29b0: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
29c0: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
29d0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
29e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
29f0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
2a00: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
2a10: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
2a20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
2a30: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2a40: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
2a50: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
2a60: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
2a70: 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32  int in1, int in2
2a80: 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f  , /* Register ho
2a90: 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a  lding operands *
2aa0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
2ab0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2ac0: 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a  re if true.  */.
2ad0: 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
2ae0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2af0: 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f  jump if either o
2b00: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a  perand is NULL *
2b10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20  /.){.  int p5;. 
2b20: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c   int addr;.  Col
2b30: 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20  lSeq *p4;..  p4 
2b40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
2b50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
2b60: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
2b70: 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e  ght);.  p5 = bin
2b80: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65  aryCompareP5(pLe
2b90: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
2ba0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20  IfNull);.  addr 
2bb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2bc0: 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op4(pParse->pVdb
2bd0: 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20  e, opcode, in2, 
2be0: 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20  dest, in1,.     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c        (void*)p4,
2c10: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
2c20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c30: 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62  eP5(pParse->pVdb
2c40: 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65  e, (u8)p5);.  re
2c50: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2c70: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  if expression pE
2c80: 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c  xpr is a vector,
2c90: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2ca0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63  ise..**.** A vec
2cb0: 74 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61  tor is defined a
2cc0: 73 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  s any expression
2cd0: 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e   that results in
2ce0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
2cf0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c  columns of resul
2d00: 74 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43  t.  Every TK_VEC
2d10: 54 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76  TOR node is an v
2d20: 65 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68  ector because th
2d30: 65 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c  e.** parser will
2d40: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20   not generate a 
2d50: 54 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66  TK_VECTOR with f
2d60: 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e  ewer than two en
2d70: 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20  tries..** But a 
2d80: 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20  TK_SELECT might 
2d90: 62 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74  be either a vect
2da0: 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20  or or a scalar. 
2db0: 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f  It is only.** co
2dc0: 6e 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f  nsidered a vecto
2dd0: 72 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20  r if it has two 
2de0: 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  or more result c
2df0: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  olumns..*/.int s
2e00: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
2e10: 6f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  or(Expr *pExpr){
2e20: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e30: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2e40: 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  pExpr)>1;.}../*.
2e50: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2e60: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
2e70: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2e80: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
2e90: 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e  ECTOR .** return
2ea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2eb0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
2ec0: 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66  e vector. Or, if
2ed0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
2ee0: 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
2ef0: 63 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ct, return the n
2f00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2f10: 20 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65   in the sub-sele
2f20: 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f  ct. For.** any o
2f30: 74 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70  ther type of exp
2f40: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
2f50: 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
2f60: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2f70: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2f80: 75 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  u8 op = pExpr->o
2f90: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
2fa0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
2fb0: 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66  pExpr->op2;.  if
2fc0: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
2fd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45  ){.    return pE
2fe0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2ff0: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xpr;.  }else if(
3000: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
3010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
3020: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
3030: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3040: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3050: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
3060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
3070: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
3080: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
3090: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
30a0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
30b0: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
30c0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
30d0: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
30e0: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
30f0: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
3100: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
3110: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
3120: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
3130: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
3140: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
3150: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
3160: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
3170: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
3180: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
3190: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
31a0: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
31b0: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
31c0: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
31d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
31e0: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
31f0: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
3200: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
3210: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
3220: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
3230: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
3240: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
3250: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
3260: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
3270: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
3280: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
3290: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
32a0: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
32b0: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
32c0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
32d0: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
32e0: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
32f0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
3300: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
3310: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
3320: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
3330: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
3340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3350: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20  pVector->op2==0 
3360: 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  || pVector->op==
3370: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
3380: 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e     if( pVector->
3390: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c  op==TK_SELECT ||
33a0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54   pVector->op2==T
33b0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
33c0: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
33d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
33e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
33f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3400: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3410: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
3420: 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  pExpr;.    }.  }
3430: 0a 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  .  return pVecto
3440: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  r;.}../*.** Comp
3450: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
3460: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
3470: 20 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73   which when pass
3480: 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ed to.** sqlite3
3490: 45 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20  ExprCode() will 
34a0: 67 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63  generate all nec
34b0: 65 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63  essary code to c
34c0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46  ompute.** the iF
34d0: 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  ield-th column o
34e0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70  f the vector exp
34f0: 72 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e  ression pVector.
3500: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20  .**.** It is ok 
3510: 66 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62  for pVector to b
3520: 65 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c  e a scalar (as l
3530: 6f 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30  ong as iField==0
3540: 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ).  .** In that 
3550: 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
3560: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ne works like sq
3570: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a  lite3ExprDup()..
3580: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3590: 20 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e   owns the return
35a0: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  ed Expr object a
35b0: 6e 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  nd is responsibl
35c0: 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e  e for.** ensurin
35d0: 67 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  g that the retur
35e0: 6e 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75  ned value eventu
35f0: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
3600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
3610: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3620: 68 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20  hip of pVector. 
3630: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
3640: 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74   TK_SELECT,.** t
3650: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
3660: 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66   object will ref
3670: 65 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61  erence pVector a
3680: 6e 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75  nd so pVector mu
3690: 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c  st remain.** val
36a0: 69 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20  id for the life 
36b0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
36c0: 6f 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63  object.  If pVec
36d0: 74 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54  tor is a TK_VECT
36e0: 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61  OR.** or a scala
36f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  r expression, th
3700: 65 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c  en it can be del
3710: 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  eted as soon as 
3720: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  returns..**.** A
3740: 20 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20   trick to cause 
3750: 61 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63  a TK_SELECT pVec
3760: 74 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65  tor to be delete
3770: 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a  d together with.
3780: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
3790: 45 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74  Expr object is t
37a0: 6f 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65  o attach the pVe
37b0: 63 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67  ctor to the pRig
37c0: 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74  ht field.** of t
37d0: 68 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53  he returned TK_S
37e0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
37f0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70  r object..*/.Exp
3800: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f  r *sqlite3ExprFo
3810: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20  rVectorField(.  
3820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3830: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3850: 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20  r *pVector,     
3860: 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e    /* The vector.
3870: 20 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73    List of expres
3880: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53  sions or a sub-S
3890: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69  ELECT */.  int i
38a0: 46 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20  Field           
38b0: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
38c0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f  of the vector to
38d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20   return */.){.  
38e0: 45 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66  Expr *pRet;.  if
38f0: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3900: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
3910: 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d  assert( pVector-
3920: 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
3930: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20  elect );.    /* 
3940: 54 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  The TK_SELECT_CO
3950: 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a  LUMN Expr node:.
3960: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c      **.    ** pL
3970: 65 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70  eft:           p
3980: 56 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e  Vector containin
3990: 67 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f  g TK_SELECT.  No
39a0: 74 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  t deleted..    *
39b0: 2a 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20  * pRight:       
39c0: 20 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75     not used.  Bu
39d0: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65  t recursively de
39e0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43  leted..    ** iC
39f0: 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49  olumn:         I
3a00: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
3a10: 20 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20   in pVector.    
3a20: 2a 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20  ** iTable:      
3a30: 20 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d      0 or the num
3a40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
3a50: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20  n the LHS of an 
3a60: 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a  assignment.    *
3a70: 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a  * pLeft->iTable:
3a80: 20 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61     First in an a
3a90: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
3aa0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c   holding result,
3ab0: 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20   or 0.    **    
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3ad0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
3ae0: 6f 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e  ot yet computed.
3af0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
3b00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b10: 28 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  () specifically 
3b20: 73 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73  skips the recurs
3b30: 69 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20  ive delete of.  
3b40: 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b    ** pLeft on TK
3b50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3b60: 6f 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68  odes.  But pRigh
3b70: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73  t is followed, s
3b80: 6f 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a  o pVector.    **
3b90: 20 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64   can be attached
3ba0: 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61   to pRight to ca
3bb0: 75 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f  use this node to
3bc0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
3bd0: 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f  of.    ** pVecto
3be0: 72 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  r.  Typically th
3bf0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74  ere will be mult
3c00: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3c10: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20  OLUMN nodes.    
3c20: 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
3c30: 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74   pLeft pointer t
3c40: 6f 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62  o the pVector, b
3c50: 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  ut only one of t
3c60: 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  hem.    ** will 
3c70: 6f 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e  own the pVector.
3c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74  .    */.    pRet
3c90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
3ca0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
3cb0: 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  T_COLUMN, 0, 0);
3cc0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
3cd0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f  .      pRet->iCo
3ce0: 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20  lumn = iField;. 
3cf0: 20 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74       pRet->pLeft
3d00: 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20   = pVector;.    
3d10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
3d20: 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69  et==0 || pRet->i
3d30: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65  Table==0 );.  }e
3d40: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65  lse{.    if( pVe
3d50: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43  ctor->op==TK_VEC
3d60: 54 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20  TOR ) pVector = 
3d70: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3d80: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3d90: 72 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  r;.    pRet = sq
3da0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3db0: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3dc0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
3dd0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
3de0: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3df0: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3e00: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3e10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3e20: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3e30: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3e40: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3e50: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3e60: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3e70: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3e80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3e90: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ea0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3eb0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3ee0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3ef0: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3f00: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3f10: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3f20: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3f30: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3f40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3f50: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3f60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3f70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3f80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3f90: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3fa0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3fb0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3fc0: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3fd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3fe0: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3ff0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
4000: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
4010: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
4020: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
4030: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
4040: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
4050: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
4060: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
4070: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4080: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
4090: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
40a0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
40b0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
40c0: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
40d0: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
40f0: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
4100: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
4110: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
4120: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
4130: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
4140: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
4150: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4160: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
4170: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
4180: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
4190: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
41a0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
41b0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
41c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
41d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
41e0: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
41f0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
4200: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
4210: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
4220: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
4230: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
4240: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
4250: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
4260: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
4270: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
4280: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
4290: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
42a0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
42b0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
42c0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
42d0: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
42e0: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
42f0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
4300: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
4310: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
4320: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
4330: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
4340: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
4350: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
4360: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
4370: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
43a0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43c0: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
43d0: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
43e0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4410: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4420: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4430: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4450: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
4460: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
4470: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
44a0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
44b0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44d0: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
44e0: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
44f0: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4500: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4510: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4520: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4530: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4540: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4550: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
4560: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
4570: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
4580: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
4590: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
45a0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
45b0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
45c0: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
45d0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
45e0: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
45f0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4600: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4610: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4620: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4630: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4640: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4650: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
4660: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
4670: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
4680: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
4690: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
46a0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
46b0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
46c0: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
46d0: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
46e0: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
46f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4700: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4710: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4720: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4730: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4740: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4750: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
4760: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
4770: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
4780: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
4790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47a0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
47b0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
47c0: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
47d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47e0: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
47f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4800: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4810: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4820: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4830: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4850: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
4860: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4870: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
4880: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
4890: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
48a0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
48b0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
48c0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
48d0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
48e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
48f0: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4900: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4910: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4920: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4930: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4940: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4950: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
4960: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
4970: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4980: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4990: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
49a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
49b0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
49c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
49d0: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
49e0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
49f0: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4a00: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4a10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4a20: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4a30: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4a40: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4a50: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4a60: 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  );..  if( nLeft!
4a70: 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  =sqlite3ExprVect
4a80: 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29  orSize(pRight) )
4a90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4aa0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
4ab0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
4ac0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
4ad0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
4ae0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
4af0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b00: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4b10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4b20: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b30: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4b40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b50: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
4b60: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
4b70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b80: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
4b90: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
4ba0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4bb0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4bc0: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4bd0: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4be0: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
4bf0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
4c00: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4c10: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4c20: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4c30: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4c40: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4c50: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
4c60: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
4c70: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
4c80: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
4c90: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
4ca0: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
4cb0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
4cc0: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
4cd0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4ce0: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
4cf0: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4d00: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4d10: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4d20: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4d30: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4d50: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
4d60: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
4d70: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
4d80: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
4d90: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
4da0: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
4db0: 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f    r1 = exprVecto
4dc0: 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  rRegister(pParse
4dd0: 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c  , pLeft, i, regL
4de0: 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72  eft, &pL, &regFr
4df0: 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65  ee1);.    r2 = e
4e00: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4e10: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
4e20: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
4e30: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
4e40: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
4e50: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
4e60: 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73  opx, r1, r2, des
4e70: 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74  t, p5);.    test
4e80: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
4e90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ea0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
4eb0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4ec0: 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
4ed0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ee0: 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
4ef0: 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
4f00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f10: 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65  ==OP_Gt);.    te
4f20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
4f30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
4f50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f60: 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
4f70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f80: 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Eq);.    testca
4f90: 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
4fa0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fb0: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
4fc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4fd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4fe0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c  gFree1);.    sql
4ff0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5000: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
5010: 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  ee2);.    if( i=
5020: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
5030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5040: 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45     if( opx==TK_E
5050: 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q ){.      sqlit
5060: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5070: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
5080: 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43  addrDone); VdbeC
5090: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
50a0: 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b    p5 |= SQLITE_K
50b0: 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  EEPNULL;.    }el
50c0: 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e  se if( opx==TK_N
50d0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
50e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
50f0: 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64  OP_If, dest, add
5100: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
5110: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
5120: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5130: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
5140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
5150: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p==TK_LT || op==
5160: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_GT || op==TK_
5170: 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20  LE || op==TK_GE 
5180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51a0: 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61  _ElseNotEq, 0, a
51b0: 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  ddrDone);.      
51c0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
51d0: 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  , op==TK_LT);.  
51e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
51f0: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29  If(v, op==TK_GT)
5200: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5210: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
5220: 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LE);.      Vdbe
5230: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5240: 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20  ==TK_GE);.      
5250: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
5260: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d   opx = op;.    }
5270: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5280: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5290: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a  , addrDone);.}..
52a0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
52b0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
52c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
52d0: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
52e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
52f0: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5300: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
5310: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
5320: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
5330: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5340: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
5350: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5360: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5380: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
5390: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
53a0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
53b0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
53c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
53d0: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
53e0: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
53f0: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
5400: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5410: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
5420: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
5430: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
5440: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
5450: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
5460: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
5470: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5480: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
54a0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
54b0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
54c0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
54d0: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
54e0: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
54f0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
5500: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
5510: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
5520: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5530: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
5540: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5550: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
5560: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
5570: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
5580: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
5590: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
55a0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
55b0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
55c0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
55d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
55e0: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
55f0: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
5600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5610: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
5620: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
5630: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
5650: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
5660: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
5670: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
5680: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5690: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
56a0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
56b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
56c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
56d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
56e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
56f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5700: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5710: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
5720: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
5730: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5740: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
5750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69  lect *pSelect, i
5760: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5770: 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f   Select *p;.  fo
5780: 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20  r(p=pSelect; p; 
5790: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
57a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57b0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
57c0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57d0: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
57e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57f0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5800: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
5810: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5820: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5830: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5840: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5850: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5860: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5870: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5880: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5890: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
58a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
58b0: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
58c0: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
58d0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
58e0: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
58f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
5900: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
5910: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
5920: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
5930: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
5940: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
5950: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
5960: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
5970: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5980: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5990: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
59a0: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
59b0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  one..**.** Also 
59c0: 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f  propagate EP_Pro
59d0: 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20  pagate flags up 
59e0: 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73  from Expr.x.pLis
59f0: 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c  t to Expr.flags,
5a00: 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61  .** if appropria
5a10: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
5a20: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
5a30: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
5a40: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5a50: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5a60: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
5a70: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5a80: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
5a90: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
5aa0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ab0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5ac0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
5ad0: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
5ae0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
5af0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c  else if( p->x.pL
5b00: 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ist ){.    heigh
5b10: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78  tOfExprList(p->x
5b20: 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74  .pList, &nHeight
5b30: 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  );.    p->flags 
5b40: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
5b50: 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
5b60: 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73  tFlags(p->x.pLis
5b70: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
5b80: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5b90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
5ba0: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
5bb0: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
5bc0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
5bd0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
5be0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
5bf0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5c00: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5c10: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
5c20: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
5c30: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
5c40: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5c50: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
5c60: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
5c70: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
5c80: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
5c90: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
5ca0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5cb0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
5cc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5cd0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50  pr *p){.  if( pP
5ce0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
5cf0: 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65  urn;.  exprSetHe
5d00: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
5d10: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
5d20: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
5d30: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
5d40: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
5d50: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5d60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5d70: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
5d80: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
5d90: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
5da0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
5db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
5dc0: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
5dd0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
5de0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5df0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
5e00: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
5e10: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
5e20: 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20  else /* ABOVE:  
5e30: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5e40: 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c  nt enabled.  BEL
5e50: 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72  OW: Height enfor
5e60: 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a  cement off */./*
5e70: 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c  .** Propagate al
5e80: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5e90: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5ea0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5eb0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ed0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5ee0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5ef0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5f00: 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c  if( p && p->x.pL
5f10: 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50  ist && !ExprHasP
5f20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5f30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5f40: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5f50: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5f60: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5f70: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5f80: 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53  .}.#define exprS
5f90: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
5fa0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
5fb0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
5fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5fd0: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
5fe0: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
5ff0: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
6000: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
6010: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
6020: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
6030: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
6040: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
6050: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
6060: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
6070: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
6080: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
6090: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
60a0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
60b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
60c0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
60d0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
60e0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
60f0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
6100: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
6110: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
6120: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
6130: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
6140: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
6150: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
6160: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
6170: 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68  s performed.  Th
6180: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
6190: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
61a0: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
61b0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
61c0: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
61d0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
61e0: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
61f0: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
6200: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
6210: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
6220: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
6230: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
6240: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
6250: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
6260: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
6270: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
6280: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
6290: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
62a0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
62b0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
62c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
62d0: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
62e0: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
62f0: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
6300: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
6310: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
6320: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
6330: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
6340: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
6350: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
6360: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
6370: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
6380: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
6390: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
63a0: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
63b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
63c0: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
63d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
63e0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
63f0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
6400: 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20  locRawNN() */.  
6410: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6420: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6430: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
6440: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
6450: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
6460: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6470: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6480: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
64a0: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
64b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
64c0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
64d0: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
64e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
64f0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6500: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
6510: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
6520: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
6530: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
6540: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
6550: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
6560: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6570: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6580: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6590: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
65a0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
65b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
65c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
65d0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
65e0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
65f0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6600: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6610: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
6620: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
6630: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6640: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6650: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
6660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6670: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6680: 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b  ntValue|EP_Leaf;
6690: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66a0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
66d0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
66e0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
66f0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6700: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6710: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6720: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6730: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6740: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6750: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6760: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6770: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
6780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
6790: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67a0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
67d0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
67e0: 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  ]=='"' ) pNew->f
67f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
6800: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  oted;.          
6810: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
6820: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
6830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6840: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
6850: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6860: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
6870: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
6880: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
6890: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68a0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
68b0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
68c0: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
68d0: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
68e0: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
68f0: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6900: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6910: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6920: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6930: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6950: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
6960: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6990: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69a0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
69b0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
69c0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
69d0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
69e0: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
69f0: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a10: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a20: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a30: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a40: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6a50: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6a60: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6a70: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6a80: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6a90: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6aa0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6ab0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6ac0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6ad0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6ae0: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6af0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b00: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b10: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b20: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b30: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b40: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6b50: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6b60: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6b70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6b80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6b90: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6bc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6bd0: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6be0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6bf0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c00: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c10: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c20: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c30: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c40: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6c50: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6c60: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6c70: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6c80: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6c90: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6ca0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6cc0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6ce0: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6cf0: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d00: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d10: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d20: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d30: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d40: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6d50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6d60: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6d70: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6d80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6d90: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6db0: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6dc0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6dd0: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6de0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6df0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e30: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e40: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6e50: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6e60: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6e70: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6e80: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6e90: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ea0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6eb0: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6ec0: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6ed0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6ee0: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6ef0: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6f00: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6f10: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6f20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6f30: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6f40: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6f50: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6f60: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
6f70: 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
6f80: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  ->db, sizeof(Exp
6f90: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  r));.    if( p )
6fa0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
6fb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6fc0: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20  ));.      p->op 
6fd0: 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  = op & TKFLG_MAS
6fe0: 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67  K;.      p->iAgg
6ff0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
7000: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7010: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
7020: 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c  e->db, p, pLeft,
7030: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7040: 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71  if( p ) {.    sq
7050: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
7060: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
7070: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
7080: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7090: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
70a0: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
70b0: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70c0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70d0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70f0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
7100: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
7110: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7120: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7130: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7140: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7150: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7160: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7170: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7180: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7190: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
71a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
71b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71c0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71d0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71e0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71f0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
7200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7210: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7220: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7230: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7240: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7250: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7260: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
7270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
7280: 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55 45  ways either TRUE
7290: 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70 65   or FALSE (respe
72a0: 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65  ctively),.** the
72b0: 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  n return 1.  If 
72c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72  one cannot deter
72d0: 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20 76  mine the truth v
72e0: 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65  alue of the.** e
72f0: 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d  xpression at com
7300: 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72 6e  pile-time return
7310: 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69   0..**.** This i
7320: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
7330: 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 20  n.  If is OK to 
7340: 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76  return 0 here ev
7350: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78 70  en if.** the exp
7360: 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69  ression really i
7370: 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 6f  s always false o
7380: 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73 65  r false (a false
7390: 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42   negative)..** B
73a0: 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20 74  ut it is a bug t
73b0: 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74 68  o return 1 if th
73c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
73d0: 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ht have differen
73e0: 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  t.** boolean val
73f0: 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  ues in different
7400: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28   circumstances (
7410: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
7420: 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  .).**.** Note th
7430: 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  at if the expres
7440: 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  sion is part of 
7450: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20  conditional for 
7460: 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  a.** LEFT JOIN, 
7470: 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64  then we cannot d
7480: 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70  etermine at comp
7490: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
74a0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74   or not.** is it
74b0: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20   true or false, 
74c0: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
74d0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
74e0: 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  t exprAlwaysTrue
74f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
7500: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7510: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7520: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7540: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7550: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7560: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7570: 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63  n v!=0;.}.static
7580: 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46   int exprAlwaysF
7590: 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  alse(Expr *p){. 
75a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
75b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
75c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
75d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
75e0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
75f0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
7600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7610: 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn v==0;.}../
7620: 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78  *.** Join two ex
7630: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
7640: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
7650: 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72    If either expr
7660: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c  ession is.** NUL
7670: 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  L, then just ret
7680: 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78  urn the other ex
7690: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
76a0: 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  If one side or t
76b0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
76c0: 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  AND is known to 
76d0: 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69  be false, then i
76e0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74  nstead.** of ret
76f0: 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78  urning an AND ex
7700: 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72  pression, just r
7710: 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74  eturn a constant
7720: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
7730: 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66  .** a value of f
7740: 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  alse..*/.Expr *s
7750: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
7760: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7770: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
7780: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
7790: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
77a0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
77b0: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
77c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77d0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69  pLeft;.  }else i
77e0: 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
77f0: 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70  se(pLeft) || exp
7800: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69  rAlwaysFalse(pRi
7810: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
7820: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7830: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
7840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7850: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  db, pRight);.   
7860: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
7870: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7880: 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
7890: 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30  3IntTokens[0], 0
78a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
78b0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
78c0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
78d0: 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b  , TK_AND, 0, 0);
78e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
78f0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64  AttachSubtrees(d
7900: 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20  b, pNew, pLeft, 
7910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
7920: 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  urn pNew;.  }.}.
7930: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
7940: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
7950: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
7960: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
7970: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
7980: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
7990: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a  e3ExprFunction(.
79a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
79b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
79c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
79d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
79e0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
79f0: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  t list */.  Toke
7a00: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20  n *pToken,      
7a10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7a20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
7a30: 6e 74 20 65 44 69 73 74 69 6e 63 74 20 20 20 20  nt eDistinct    
7a40: 20 20 20 20 20 2f 2a 20 53 46 5f 44 69 73 74 69       /* SF_Disti
7a50: 6e 63 74 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72  nct or SF_ALL or
7a60: 20 30 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20   0 */.){.  Expr 
7a70: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7a80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7aa0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7ab0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7ac0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7ad0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7ae0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7af0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7b00: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7b10: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7b20: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7b30: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7b40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7b50: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
7b60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70  pList->nExpr > p
7b70: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
7b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
7b90: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a  UNCTION_ARG] ){.
7ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7bb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
7bc0: 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20   many arguments 
7bd0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c  on function %T",
7be0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
7bf0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
7c00: 70 4c 69 73 74 3b 0a 20 20 45 78 70 72 53 65 74  pList;.  ExprSet
7c10: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7c20: 50 5f 48 61 73 46 75 6e 63 29 3b 0a 20 20 61 73  P_HasFunc);.  as
7c30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7c40: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
7c50: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
7c60: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
7c70: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7c80: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  rse, pNew);.  if
7c90: 28 20 65 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f  ( eDistinct==SF_
7ca0: 44 69 73 74 69 6e 63 74 20 29 20 45 78 70 72 53  Distinct ) ExprS
7cb0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  etProperty(pNew,
7cc0: 20 45 50 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20   EP_Distinct);. 
7cd0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7ce0: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
7cf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7d00: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7d10: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
7d20: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
7d30: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7d40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
7d50: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
7d60: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
7d70: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
7d80: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
7d90: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
7da0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
7db0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7dc0: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
7dd0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
7de0: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
7df0: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
7e00: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
7e10: 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20 61 20   big to avoid a 
7e20: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
7e30: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
7e40: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7e50: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
7e60: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
7e70: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7e80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
7e90: 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72  aaa", "@aaa", or
7ea0: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
7eb0: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
7ec0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
7ed0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
7ee0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
7ef0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
7f00: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
7f10: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
7f20: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
7f30: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
7f40: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7f50: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
7f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f70: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
7f80: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
7f90: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
7fa0: 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65  u32 n){.  sqlite
7fb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7fc0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
7fd0: 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a   *z;.  ynVar x;.
7fe0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8000: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8010: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
8020: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
8030: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
8040: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
8050: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
8060: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
8070: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
8080: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
8090: 75 33 32 29 73 71 6c 69 74 65 33 53 74 72 6c 65  u32)sqlite3Strle
80a0: 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20  n30(z) );.  if( 
80b0: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
80c0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
80d0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
80e0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
8110: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d  =='?' );.    x =
8120: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8130: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73  e->nVar);.  }els
8140: 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64  e{.    int doAdd
8150: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b   = 0;.    if( z[
8160: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
8170: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
8180: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
8190: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
81a0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
81b0: 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69  d.      ** use i
81c0: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
81d0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
81e0: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69    i64 i;.      i
81f0: 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66  nt bOk;.      if
8200: 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49  ( n==2 ){ /*OPTI
8210: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45  MIZATION-IF-TRUE
8220: 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d 20 7a  */.        i = z
8230: 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65  [1]-'0';  /* The
8240: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
8250: 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ?N for a single 
8260: 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20  digit N */.     
8270: 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
8280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8290: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
82a0: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
82b0: 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55  i, n-1, SQLITE_U
82c0: 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
82d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
82e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
82f0: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
8300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
8310: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
8320: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8330: 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20  E_NUMBER]-1 );. 
8340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
8350: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
8360: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8370: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
8380: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
8390: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
83a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
83b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
83c0: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ER] ){.        s
83d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
83e0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
83f0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
8400: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
8410: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
8420: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
8430: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8440: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
8450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8460: 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20 28 79    }.      x = (y
8470: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 69 66  nVar)i;.      if
8480: 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( x>pParse->nVar
8490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
84a0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
84b0: 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  x;.        doAdd
84c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
84d0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 56 4c 69  e if( sqlite3VLi
84e0: 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72  stNumToName(pPar
84f0: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d  se->pVList, x)==
8500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 41  0 ){.        doA
8510: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8530: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
8540: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
8550: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
8560: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8570: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
8580: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
8590: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
85a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
85b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
85c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
85d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
85e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
85f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
8600: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
8610: 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71 6c 69   x = (ynVar)sqli
8620: 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75  te3VListNameToNu
8630: 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  m(pParse->pVList
8640: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  , z, n);.      i
8650: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
8660: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8670: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8680: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8690: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
86a0: 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64 20 29  .    if( doAdd )
86b0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
86c0: 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pVList = sqlite3
86d0: 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70 50 61  VListAdd(db, pPa
86e0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
86f0: 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  n, x);.    }.  }
8700: 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  .  pExpr->iColum
8710: 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78 3e 64  n = x;.  if( x>d
8720: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8730: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8740: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
8750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8770: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
8780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8790: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
87a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
87b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
87c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
87d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
87e0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
87f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8800: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8810: 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ;.  /* Sanity ch
8820: 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74  eck: Assert that
8830: 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73   the IntValue is
8840: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66   non-negative if
8850: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
8860: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
8880: 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75  ntValue) || p->u
8890: 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20  .iValue>=0 );.. 
88a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
88b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
88c0: 57 69 6e 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79  WinFunc) || p->y
88d0: 2e 70 57 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e  .pWin!=0 || db->
88e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
88f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
8900: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
8910: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8920: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
8930: 45 50 5f 52 65 64 75 63 65 64 29 0a 20 20 20 20  EP_Reduced).    
8940: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57        || p->y.pW
8950: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
8960: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57  Property(p, EP_W
8970: 69 6e 46 75 6e 63 29 20 29 3b 0a 23 69 66 64 65  inFunc) );.#ifde
8980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8990: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
89a0: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
89b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
89c0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
89d0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
89e0: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
89f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8a00: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8a10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8a20: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
8a30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8a40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8a50: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
8a60: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
8a70: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
8a80: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8a90: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8aa0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8ab0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8ac0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8ad0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8ae0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8af0: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
8b00: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8b10: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8b20: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
8b30: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eft);.    if( p-
8b40: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8b50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b60: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67  teNN(db, p->pRig
8b70: 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ht);.    }else i
8b80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b90: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8ba0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
8bb0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
8bc0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
8bd0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8be0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8bf0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8c00: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8c10: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
8c20: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8c30: 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
8c40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
8c50: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
8c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
8c70: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
8c80: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  >y.pWin);.    }.
8c90: 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
8ca0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8cb0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69  MemToken) ) sqli
8cc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8cd0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  >u.zToken);.  if
8ce0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8cf0: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
8d00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8d10: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
8d20: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8d30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8d40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8d50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8d60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8d70: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
8d80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8d90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8da0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8db0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8dc0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8dd0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8de0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8df0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8e00: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8e10: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8e20: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8e30: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8e40: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8e50: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8e60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8e70: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8e80: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8e90: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8ea0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8eb0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8ec0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8ed0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8ee0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8ef0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8f00: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8f10: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8f20: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8f30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8f40: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8f50: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8f60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8f80: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8f90: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8fa0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8fb0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8fc0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8fd0: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8fe0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8ff0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
9000: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
9010: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
9020: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
9030: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
9040: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
9050: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
9060: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
9070: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
9080: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
90d0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
90e0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
90f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9100: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
9110: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
9120: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
9130: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
9140: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9150: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
9160: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
9170: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
9180: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
9190: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
91a0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
91b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
91c0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
91d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
91e0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
91f0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
9200: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
9210: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
9220: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
9230: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
9240: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
9250: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
9260: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9270: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9280: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9290: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
92a0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
92b0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
92c0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
92d0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
92e0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
92f0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9300: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
9310: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9320: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
9330: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
9340: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
9350: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
9360: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9370: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9380: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9390: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
93a0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
93b0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
93c0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
93d0: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
93e0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
93f0: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9400: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
9410: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
9420: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
9430: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
9440: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
9450: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
9460: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9470: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9480: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9490: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
94a0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
94b0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
94c0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
94d0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
94e0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
94f0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9500: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
9510: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
9520: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
9530: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
9540: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9550: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
9560: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9570: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9580: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9590: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
95a0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
95b0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
95c0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
95d0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
95e0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
95f0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9600: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
9610: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9620: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9630: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9640: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9650: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9660: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9670: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9680: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96a0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
96b0: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
96c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
96d0: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
96e0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
96f0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9700: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9710: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9720: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
9730: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
9740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9750: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9760: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9770: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9790: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
97a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
97b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
97c0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
97d0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
97e0: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
97f0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9800: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
9810: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
9820: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9840: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9850: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
9860: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9870: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9890: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
98a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
98b0: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
98c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98d0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
98e0: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
98f0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9900: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9910: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
9920: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
9930: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
9940: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9950: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
9960: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9970: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9980: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9990: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
99a0: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
99b0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
99c0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
99d0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
99e0: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
99f0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9a00: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
9a10: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9a20: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9a50: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9a60: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9a70: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9a80: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9a90: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9aa0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9ab0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9ac0: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9ad0: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9ae0: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9af0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9b00: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
9b10: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9b20: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9b30: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9b40: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9b50: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
9b60: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9b70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9b80: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9b90: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9ba0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9bb0: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9bc0: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9bd0: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9be0: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9bf0: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9c00: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
9c10: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9c20: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9c30: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9c40: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9c50: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
9c60: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9c70: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9c80: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9c90: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9ca0: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9cb0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9cc0: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9cd0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9ce0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9cf0: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9d00: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9d10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9d20: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9d30: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9d40: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9d50: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9d60: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9d80: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9d90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9da0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9db0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9dc0: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9dd0: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9de0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9df0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9e00: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9e10: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9e20: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9e30: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9e40: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9e50: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9e60: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9e70: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9e80: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9e90: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9ea0: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9eb0: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9ec0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9ed0: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9ee0: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9ef0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9f00: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9f10: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9f20: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9f30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9f40: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9f50: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9f60: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9f70: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9f80: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9fa0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9fb0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9fd0: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9fe0: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9ff0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
a000: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
a010: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
a020: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
a030: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
a040: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
a050: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
a060: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
a070: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
a080: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a090: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
a0a0: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
a0b0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
a0c0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
a0d0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
a0e0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
a0f0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
a100: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
a110: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a120: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
a130: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
a140: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
a150: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
a160: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
a170: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
a180: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
a190: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
a1a0: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
a1b0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
a1c0: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
a1d0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
a1e0: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
a1f0: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
a200: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
a210: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
a220: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
a230: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
a240: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
a250: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
a260: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a270: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a280: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a290: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a2a0: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a2b0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a2c0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a2d0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a2e0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a2f0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a300: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a310: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a320: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a330: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a340: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a350: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a360: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a370: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a380: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a390: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a3a0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a3b0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a3c0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a3d0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a3f0: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a400: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a410: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a420: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a430: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a440: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a450: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a460: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a480: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a490: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a4a0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a4b0: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a4c0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a4d0: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a4e0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a4f0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a500: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a510: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a520: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a530: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a540: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a550: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a560: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a570: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a580: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a590: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a5a0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a5b0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a5c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a5d0: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a5e0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a5f0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a600: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a610: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a620: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a630: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a640: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a650: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a660: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a670: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a680: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a690: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a6a0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a6b0: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a6c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a6d0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a6e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a6f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a700: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a710: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a720: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a730: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a740: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a750: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a760: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a770: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a780: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a790: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a7a0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a7b0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a7c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a7d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a7e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a7f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a800: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a810: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a820: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a830: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a840: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a850: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a860: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a870: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a880: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a890: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a8a0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a8b0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a8c0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a8d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a8e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a8f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a900: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a910: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a920: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a930: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a940: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a960: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a970: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a980: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a9b0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a9c0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a9d0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a9e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a9f0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
aa00: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
aa10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
aa20: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
aa30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
aa40: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
aa50: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
aa60: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
aa70: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
aa80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
aa90: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
aaa0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
aab0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
aac0: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
aad0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
aaf0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
ab00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ab10: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
ab20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ab30: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
ab40: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
ab50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
ab60: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
ab80: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
ab90: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
aba0: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
abb0: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
abc0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
abd0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
abe0: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
abf0: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
ac00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ac10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ac20: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
ac30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac40: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
ac50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
ac60: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
ac70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ac80: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aca0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
acb0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
acc0: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
acd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
ace0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
acf0: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
ad00: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
ad10: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
ad20: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
ad30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
ad40: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
ad50: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
ad60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ad70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ad80: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ad90: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ada0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
adb0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
adc0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
add0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
ade0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
adf0: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
ae00: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
ae10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ae20: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ae30: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ae40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ae50: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
ae60: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
ae70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
ae80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
ae90: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
aea0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
aeb0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
aec0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
aed0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
aee0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
aef0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
af00: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
af10: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
af20: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
af30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
af40: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
af50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
af70: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
af80: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
af90: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
afa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
afb0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
afc0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
afd0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
afe0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
aff0: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
b000: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b010: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
b020: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
b030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
b040: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
b050: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
b060: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
b070: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
b080: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
b090: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
b0a0: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
b0b0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
b0c0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
b0d0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
b0e0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b0f0: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
b100: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b110: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b120: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b130: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 45  K_FUNCTION && pE
b140: 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 29  xpr->y.pWin!=0 )
b150: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78  {.    assert( Ex
b160: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
b170: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
b180: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79   );.    pExpr->y
b190: 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 20  .pWin->pNextWin 
b1a0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
b1b0: 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20 20  lect->pWin;.    
b1c0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65  pWalker->u.pSele
b1d0: 63 74 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70 72  ct->pWin = pExpr
b1e0: 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20 20  ->y.pWin;.  }.  
b1f0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
b200: 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
b210: 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  t gatherSelectWi
b220: 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62  ndowsSelectCallb
b230: 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ack(Walker *pWal
b240: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
b250: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61  .  return p==pWa
b260: 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20  lker->u.pSelect 
b270: 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a  ? WRC_Continue :
b280: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74   WRC_Prune;.}.st
b290: 61 74 69 63 20 76 6f 69 64 20 67 61 74 68 65 72  atic void gather
b2a0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65  SelectWindows(Se
b2b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  lect *p){.  Walk
b2c0: 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
b2d0: 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72  allback = gather
b2e0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c  SelectWindowsCal
b2f0: 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65  lback;.  w.xSele
b300: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74  ctCallback = gat
b310: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b320: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a  SelectCallback;.
b330: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b340: 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  ack2 = 0;.  w.u.
b350: 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73  pSelect = p;.  s
b360: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
b370: 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69  (&w, p);.}.#endi
b380: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  f.../*.** The fo
b390: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
b3a0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
b3b0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
b3c0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
b3d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
b3e0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
b3f0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
b400: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
b410: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
b420: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
b430: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
b440: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
b450: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
b460: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
b470: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
b480: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
b490: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
b4a0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
b4b0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
b4c0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
b4d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b4e0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
b4f0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
b500: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
b510: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b520: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b530: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b540: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b550: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b560: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b570: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b580: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b590: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b5a0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b5b0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b5c0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b5d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b5e0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b5f0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b600: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b610: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b620: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b630: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b640: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b650: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b660: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b670: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b680: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b690: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b6a0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b6b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b6c0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b6d0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b6e0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b6f0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b700: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b710: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b720: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b730: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b740: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b750: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b760: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b770: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b780: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b790: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b7a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b7b0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b7c0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b7d0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b7e0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b7f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b800: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b810: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b820: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b830: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b840: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b850: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b870: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b880: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b890: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b8a0: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b8c0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b8d0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b8e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b8f0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b900: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b910: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b920: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b930: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b940: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b950: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b960: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b970: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b980: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b990: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b9a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b9b0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b9c0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b9d0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b9e0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b9f0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
ba00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
ba10: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
ba20: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
ba30: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
ba40: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
ba50: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
ba60: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
ba70: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ba80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ba90: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
baa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bab0: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
bac0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
bad0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
bae0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
baf0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
bb00: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
bb10: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
bb20: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
bb30: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
bb40: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
bb50: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
bb60: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
bb70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
bb80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bb90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bba0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bbb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
bbc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
bbd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bbe0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
bbf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
bc00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
bc10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
bc20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
bc30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
bc40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
bc50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
bc60: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
bc70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
bc80: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
bc90: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
bca0: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
bcb0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
bcc0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
bcd0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
bce0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
bcf0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
bd00: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
bd10: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
bd20: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bd30: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
bd40: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
bd50: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
bd60: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
bd70: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
bd80: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
bd90: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
bda0: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
bdb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bdc0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
bdd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bde0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
bdf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
be00: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
be10: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
be20: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
be30: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
be40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
be50: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
be60: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
be70: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
be80: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
be90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bea0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
beb0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
bec0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
bed0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
bee0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
bef0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bf00: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
bf10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bf20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bf30: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
bf40: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
bf50: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
bf60: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
bf70: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
bf80: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bf90: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
bfa0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
bfb0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bfc0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bfd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bfe0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bff0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
c000: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
c010: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
c020: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c030: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c040: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
c050: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c060: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c070: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c080: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c090: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
c0a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c0b0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c0c0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
c0d0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
c0e0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
c0f0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
c100: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
c110: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
c120: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
c130: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
c140: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
c150: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
c160: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
c170: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
c180: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
c190: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
c1a0: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
c1b0: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
c1c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1d0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
c1e0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
c1f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
c200: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
c210: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
c220: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
c230: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
c240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
c250: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
c260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c270: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
c280: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
c290: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
c2a0: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
c2b0: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
c2c0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
c2d0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
c2e0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
c2f0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
c300: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
c310: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c320: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c330: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
c340: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c350: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
c360: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
c370: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
c380: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c390: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
c3a0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
c3b0: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
c3c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
c3d0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
c3e0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
c3f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c400: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
c410: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
c420: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
c430: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
c440: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
c450: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c460: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c470: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
c480: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c490: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
c4a0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
c4b0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
c4c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
c4d0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
c4e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c4f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
c500: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
c510: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c520: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c530: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c540: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c550: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c560: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c570: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c580: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c590: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c5a0: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c5b0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c5c0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c5d0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c5e0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c5f0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c600: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c610: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c620: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c630: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c640: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c650: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c660: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c670: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c680: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c690: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c6a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c6b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c6c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c6d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c6e0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c6f0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c700: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c720: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c730: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c740: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c750: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c760: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c770: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c780: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c790: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c7a0: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c7b0: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c7c0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c7d0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c7e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c7f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c800: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c810: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c820: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c830: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c840: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c850: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c860: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c870: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c880: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c890: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c8a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c8b0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c8c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c8d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c8e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c8f0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c900: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c910: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c920: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c930: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c940: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c950: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c960: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c970: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c980: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c990: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c9a0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c9b0: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c9c0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c9d0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c9e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c9f0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
ca00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
ca10: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
ca20: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
ca30: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
ca40: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
ca50: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
ca60: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
ca70: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ca80: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
ca90: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
caa0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
cab0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
cac0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
cad0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
cae0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
caf0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
cb00: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
cb10: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
cb20: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
cb30: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
cb40: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
cb50: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
cb60: 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  fn);.    if( p->
cb70: 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65 6c  pWin ) gatherSel
cb80: 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29  ectWindows(pNew)
cb90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  ;.#endif.    pNe
cba0: 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65  w->selId = p->se
cbb0: 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  lId;.    *pp = p
cbc0: 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70  New;.    pp = &p
cbd0: 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  New->pPrior;.   
cbe0: 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20   pNext = pNew;. 
cbf0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
cc00: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  t;.}.#else.Selec
cc10: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
cc20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
cc30: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
cc40: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
cc50: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
cc60: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
cc70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
cc80: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
cc90: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
cca0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
ccb0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
ccc0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
ccd0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
cce0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
ccf0: 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72  .** The pList ar
cd00: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  gument must be e
cd10: 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
cd20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78  pointer to an Ex
cd30: 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e  prList.** obtain
cd40: 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  ed from a prior 
cd50: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
cd60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  xprListAppend().
cd70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
cd80: 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  * may not be use
cd90: 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69  d with an ExprLi
cda0: 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  st obtained from
cdb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cdc0: 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e  Dup()..** Reason
cdd0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
cde0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
cdf0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
ce00: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a   in pList->a[].*
ce10: 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  * is a power of 
ce20: 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72  two.  That is tr
ce30: 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78  ue for sqlite3Ex
ce40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  prListAppend() r
ce50: 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73  eturns.** but is
ce60: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
ce70: 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72   true from the r
ce80: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
ce90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cea0: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  p()..**.** If a 
ceb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
cec0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
ced0: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
cee0: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
cef0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
cf00: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
cf10: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
cf20: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
cf30: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
cf40: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
cf50: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
cf60: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
cf70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cf80: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
cf90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
cfa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cfb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
cfc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cfd0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
cfe0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
cff0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d000: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
d010: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d020: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
d030: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
d040: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ULL */.){.  stru
d050: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d060: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
d070: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d080: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
d090: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
d0a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
d0b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
d0c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
d0d0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
d0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
d100: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
d110: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
d120: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
d130: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
d140: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
d150: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  1))==0 ){.    Ex
d160: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
d170: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
d180: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
d190: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
d1a0: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
d1b0: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  )+(2*pList->nExp
d1c0: 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c  r - 1)*sizeof(pL
d1d0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
d1e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
d1f0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
d200: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
d210: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
d220: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d230: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
d240: 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  +];.  assert( of
d250: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d260: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d  prList_item,zNam
d270: 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d  e)==sizeof(pItem
d280: 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73  ->pExpr) );.  as
d290: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d2a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d2b0: 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b  tem,pExpr)==0 );
d2c0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d  .  memset(&pItem
d2d0: 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66  ->zName,0,sizeof
d2e0: 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f  (*pItem)-offseto
d2f0: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d300: 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a  t_item,zName));.
d310: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
d320: 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e   pExpr;.  return
d330: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
d340: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
d350: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
d360: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
d370: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
d380: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d390: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
d3a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d3b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  (db, pList);.  r
d3c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d3d0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70  * pColumns and p
d3e0: 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74  Expr form a vect
d3f0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68  or assignment wh
d400: 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74  ich is part of t
d410: 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65  he SET.** clause
d420: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
d430: 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74  atement.  Like t
d440: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
d450: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70    (a,b,c) = (exp
d460: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
d470: 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63  ** Or:    (a,b,c
d480: 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c  ) = (SELECT x,y,
d490: 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a  z FROM ....).**.
d4a0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  ** For each term
d4b0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 61   of the vector a
d4c0: 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e  ssignment, appen
d4d0: 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f  d new entries to
d4e0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
d4f0: 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20  on list pList.  
d500: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  In the case of a
d510: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d520: 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20   RHS, append.** 
d530: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
d540: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f   expressions..*/
d550: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
d560: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d570: 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20  Vector(.  Parse 
d580: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d590: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d5a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d5b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
d5c0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d5d0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
d5e0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49  t be NULL */.  I
d5f0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
d600: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
d610: 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66   names of LHS of
d620: 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20   the assignment 
d630: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
d640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d650: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
d660: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d670: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d680: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d690: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d6a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
d6b0: 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  i;.  int iFirst 
d6c0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
d6d0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a  >nExpr : 0;.  /*
d6e0: 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e   pColumns can on
d6f0: 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74  ly be NULL due t
d700: 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20  o an OOM but an 
d710: 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61  OOM will cause a
d720: 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f  n.  ** exit prio
d730: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
d740: 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  e being invoked 
d750: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
d760: 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f  Columns==0) ) go
d770: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d780: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
d790: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
d7a0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d7b0: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  r;..  /* If the 
d7c0: 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c  RHS is a vector,
d7d0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d   then we can imm
d7e0: 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74  ediately check t
d7f0: 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a  o see that .  **
d800: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d810: 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74   RHS and LHS mat
d820: 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  ch.  But if the 
d830: 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c  RHS is a SELECT,
d840: 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73   .  ** wildcards
d850: 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65   ("*") in the re
d860: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d870: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65  SELECT must be e
d880: 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20  xpanded before. 
d890: 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68   ** we can do th
d8a0: 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f  e size check, so
d8b0: 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65 20   defer the size 
d8c0: 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65  check until code
d8d0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a   generation..  *
d8e0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
d8f0: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p!=TK_SELECT && 
d900: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28  pColumns->nId!=(
d910: 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n=sqlite3ExprVec
d920: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29 20  torSize(pExpr)) 
d930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d940: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d950: 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
d960: 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49      pColumns->nI
d990: 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  d, n);.    goto 
d9a0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d9b0: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ror;.  }..  for(
d9c0: 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d  i=0; i<pColumns-
d9d0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
d9e0: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
d9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
da00: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
da10: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
da20: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
da30: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
da40: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
da50: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
da60: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
da70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
da80: 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b  nExpr==iFirst+i+
da90: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
daa0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
dab0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c  -1].zName = pCol
dac0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
dad0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73  ;.      pColumns
dae0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
daf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
db00: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
db10: 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f  iled && pExpr->o
db20: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
db30: 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29  ALWAYS(pList!=0)
db40: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46   ){.    Expr *pF
db50: 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  irst = pList->a[
db60: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20  iFirst].pExpr;. 
db70: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
db80: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
db90: 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d  rt( pFirst->op==
dba0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
dbb0: 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a   );.     .    /*
dbc0: 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43   Store the SELEC
dbd0: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70  T statement in p
dbe0: 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c  Right so it will
dbf0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
dc00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
dc10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20  xprListDelete() 
dc20: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  is called */.   
dc30: 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20   pFirst->pRight 
dc40: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78  = pExpr;.    pEx
dc50: 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  pr = 0;..    /* 
dc60: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
dc70: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
dc80: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
dc90: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
dcb0: 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61  and LHS sizes ma
dcc0: 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20  tch during code 
dcd0: 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  generation. */. 
dce0: 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c     pFirst->iTabl
dcf0: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  e = pColumns->nI
dd00: 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61  d;.  }..vector_a
dd10: 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73  ppend_error:.  s
dd20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
dd30: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
dd40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
dd50: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
dd60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
dd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dd80: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
dd90: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
dda0: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
ddb0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
ddc0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
ddd0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
dde0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
ddf0: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
de00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
de10: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
de20: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
de30: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
de40: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
de50: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
de60: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
de70: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
de80: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
de90: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
dea0: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
deb0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
dec0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
ded0: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
dee0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
def0: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
df00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
df10: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
df20: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
df30: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
df40: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
df50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
df60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
df70: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
df80: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
df90: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
dfa0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
dfb0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
dfc0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
dfd0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
dfe0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
dff0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e000: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e010: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e020: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
e030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e040: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e060: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e070: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e080: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e090: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
e0a0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
e0b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
e0c0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
e0d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
e0e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e0f0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
e100: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
e110: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
e120: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
e130: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e140: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e150: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e160: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e170: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
e180: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e190: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
e1a0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e1b0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e1c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
e1d0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
e1e0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
e1f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
e200: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
e210: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
e220: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
e230: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
e240: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
e250: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
e260: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
e270: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
e280: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
e290: 2c 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e  , (void*)pItem->
e2a0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
e2b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e2c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e2d0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
e2e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e2f0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e300: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e310: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e320: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e330: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e340: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e350: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
e360: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e370: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e380: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e390: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e3a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e3b0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e3c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e3d0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
e3e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e3f0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e400: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e410: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e420: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e430: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e440: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e460: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
e470: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
e480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e490: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
e4a0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
e4b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e4c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e4e0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
e4f0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
e500: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e510: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e520: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e530: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e540: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
e550: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
e560: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
e570: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e580: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e590: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
e5a0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e5b0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e5c0: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e5d0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e5e0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e5f0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e600: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e610: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e620: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e630: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e650: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e670: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e680: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e690: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e6a0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e6b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e6c0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e6d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e6e0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e6f0: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e700: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e710: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e720: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e730: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e740: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e770: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e780: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e790: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e7a0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e7b0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e7c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e7d0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e7e0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e7f0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e800: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e810: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e820: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e830: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e840: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e850: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e860: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e880: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e890: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e8a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e8b0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e8c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e8d0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e8e0: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e8f0: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e910: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e930: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e940: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e950: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e960: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e970: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e980: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e990: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e9a0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e9b0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e9c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e9d0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e9e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
e9f0: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
ea00: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
ea10: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
ea20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
ea30: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
ea40: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
ea50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
ea60: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
ea70: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
ea80: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ea90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
eaa0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
eab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
eac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
ead0: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
eae0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
eaf0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
eb00: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
eb10: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
eb20: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
eb30: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
eb40: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
eb50: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
eb60: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
eb70: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
eb80: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
eb90: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
eba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
ebb0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
ebc0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
ebd0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ebe0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ebf0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ec00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ec10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ec20: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
ec30: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
ec40: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
ec50: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
ec60: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
ec70: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
ec80: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
ec90: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
eca0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ecb0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
ecc0: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
ecd0: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
ece0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
ecf0: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
ed00: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
ed10: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
ed20: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
ed30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
ed40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ed50: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
ed60: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ed70: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
ed80: 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  , "true")==0.   
ed90: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
eda0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
edb0: 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20  n, "false")==0. 
edc0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
edd0: 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  p = TK_TRUEFALSE
ede0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
edf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ee00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
ee10: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
ee20: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70  TK_TRUEFALSE Exp
ee30: 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  r node.  Return 
ee40: 31 20 69 66 20 69 74 20 69 73 20 54 52 55 45 0a  1 if it is TRUE.
ee50: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
ee60: 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20  s FALSE..*/.int 
ee70: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
ee80: 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72  Value(const Expr
ee90: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
eea0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
eeb0: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20  K_TRUEFALSE );. 
eec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eed0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
eee0: 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d  .zToken,"true")=
eef0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
ef00: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
ef10: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c  r->u.zToken,"fal
ef20: 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  se")==0 );.  ret
ef30: 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  urn pExpr->u.zTo
ef40: 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  ken[4]==0;.}.../
ef50: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
ef60: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
ef70: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
ef80: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
ef90: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
efa0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
efb0: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
efc0: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
efd0: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
efe0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
eff0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
f000: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
f010: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
f020: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
f030: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
f040: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
f050: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
f060: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
f070: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f080: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f0a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
f0b0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f0c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
f0d0: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
f0e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f0f0: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
f100: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
f110: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f120: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f130: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
f140: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f150: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
f160: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f170: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
f180: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
f190: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
f1a0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
f1b0: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
f1c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
f1d0: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
f1e0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
f1f0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
f200: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f210: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
f220: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
f230: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
f240: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
f250: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
f260: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
f270: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
f280: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
f290: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
f2a0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
f2b0: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
f2c0: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
f2d0: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
f2e0: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
f2f0: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
f300: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
f310: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
f320: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
f330: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
f340: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
f350: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
f360: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
f370: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
f380: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
f390: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
f3a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
f3b0: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
f3c0: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
f3d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
f3e0: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
f3f0: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
f400: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
f410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
f420: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
f430: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
f440: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
f450: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
f460: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
f470: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
f480: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
f490: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
f4a0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
f4b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
f4c0: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
f4d0: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
f4e0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
f4f0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
f500: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
f510: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f520: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
f530: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f540: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
f550: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f560: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
f570: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
f580: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
f590: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
f5a0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
f5b0: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
f5c0: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
f5d0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
f5e0: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
f5f0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
f600: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
f610: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
f620: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
f630: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
f640: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
f650: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
f660: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f670: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
f680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f690: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
f6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f6b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f6c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f6d0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f6e0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f6f0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f700: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f710: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
f720: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74     /* Convert "t
f730: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20  rue" or "false" 
f740: 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  in a DEFAULT cla
f750: 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  use into the.   
f760: 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74     ** appropriat
f770: 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f  e TK_TRUEFALSE o
f780: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f790: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f7a0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
f7b0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f7c0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
f7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7e0: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
f7f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f800: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
f810: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
f820: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f830: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
f840: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f850: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
f860: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f870: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f880: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f8a0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
f8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f8c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f8d0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f8e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f8f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f900: 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61  FixedCol) && pWa
f910: 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29  lker->eCode!=2 )
f920: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f930: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f950: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f960: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f970: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f980: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f990: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f9a0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f9b0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f9c0: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f9d0: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f9e0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f9f0: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
fa00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fa10: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
fa20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fa30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
fa40: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
fa50: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fa60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
fa70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
fa80: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
fa90: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
faa0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
fab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
fac0: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
fad0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
fae0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
faf0: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
fb00: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
fb10: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
fb20: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
fb30: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fb40: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
fb50: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
fb60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fb70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
fb80: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
fb90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fba0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
fbb0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
fbc0: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
fbd0: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
fbe0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
fbf0: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
fc00: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
fc10: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
fc20: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
fc30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
fc40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
fc50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fc60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fc70: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
fc80: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
fc90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fca0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
fcb0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
fcc0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fcd0: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fce0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fcf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fd00: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
fd10: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fd20: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fd30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
fd40: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
fd50: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
fd60: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
fd70: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
fd80: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
fd90: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
fda0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
fdb0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
fdc0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
fdd0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
fde0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
fdf0: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
fe00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fe10: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
fe20: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
fe30: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
fe40: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
fe50: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
fe60: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fe70: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fe80: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fe90: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fea0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
feb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fec0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fed0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fee0: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
fef0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ff00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ff10: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
ff20: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
ff30: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
ff40: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
ff50: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
ff60: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
ff70: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
ff80: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
ff90: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
ffa0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
ffb0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
ffc0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ffd0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
ffe0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fff0: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
10000 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
10010 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
10020 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
10030 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20  **.**   (1) the 
10040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10050 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20  nstant, and.**  
10060 20 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73   (2) the express
10070 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61  ion does origina
10080 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  te in the ON or 
10090 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
100a0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
100b0 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  JOIN, and.**   (
100c0 33 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  3) the expressio
100d0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
100e0 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43  in any EP_FixedC
100f0 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  ol TK_COLUMN.** 
10100 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63        operands c
10110 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
10120 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
10130 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
10140 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
10150 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10160 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61   true, it indica
10170 74 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70  tes that the exp
10180 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ression.** can b
10190 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
101a0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
101b0 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75  r list and evalu
101c0 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a  ated once when.*
101d0 2a 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  * the prepared s
101e0 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20  tatement starts 
101f0 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  up.  See sqlite3
10200 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29  ExprCodeAtInit()
10210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10220 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
10230 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
10240 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10250 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
10260 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10270 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10280 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10290 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
102a0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
102b0 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
102c0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
102d0 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
102e0 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
102f0 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
10300 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
10310 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
10320 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
10330 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
10340 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
10350 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
10360 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
10370 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
10380 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
10390 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
103a0 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
103b0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
103c0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
103d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
103e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
103f0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
10400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10410 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10420 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
10430 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
10440 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
10450 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
10460 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
10470 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
10480 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
10490 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
104a0 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
104b0 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
104c0 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
104d0 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
104e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
104f0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
10500 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
10510 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
10520 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
10530 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10540 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
10550 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
10560 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
10570 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
10580 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
10590 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
105a0 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  ( sqlite3IsBinar
105b0 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  y(pColl) ){.    
105c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
105d0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
105e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
105f0 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10600 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
10610 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
10620 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
10630 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10640 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
10650 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
10660 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
10670 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
10680 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
10690 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
106a0 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
106b0 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
106c0 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
106d0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
106e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
106f0 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
10700 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
10710 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10720 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
10730 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
10740 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
10750 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
10760 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
10770 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
10780 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
10790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
107a0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
107b0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
107c0 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
107d0 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
107e0 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
107f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10800 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
10810 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
10820 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
10830 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
10840 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
10850 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
10860 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
10870 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
10880 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
10890 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
108a0 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
108b0 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
108c0 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
108d0 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
108e0 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
108f0 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
10900 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
10910 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
10920 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
10930 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
10940 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
10950 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
10960 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
10970 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
10980 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
10990 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
109a0 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
109b0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
109c0 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
109d0 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
109e0 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
109f0 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
10a00 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10a10 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10a20 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
10a30 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
10a40 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
10a50 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
10a60 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
10a70 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
10a80 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
10a90 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
10aa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10ab0 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10ac0 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10ad0 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10ae0 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
10af0 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
10b00 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10b10 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10b20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10b30 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
10b40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10b50 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
10b60 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
10b70 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
10b80 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
10b90 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
10ba0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10bb0 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10bc0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10bd0 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10be0 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
10bf0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
10c00 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10c10 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10c20 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
10c30 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10c40 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10c50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10c60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10c70 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
10c80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
10c90 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
10ca0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10cb0 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10cc0 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10cd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10ce0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10d00 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10d10 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10d20 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10d30 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10d40 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
10d50 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
10d60 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
10d70 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
10d80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10d90 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
10da0 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10db0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10dc0 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10dd0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10de0 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
10df0 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
10e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e10 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
10e20 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10e30 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10e40 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
10e50 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
10e60 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
10e70 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
10e80 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
10e90 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
10ea0 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10eb0 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10ec0 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10ed0 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10ee0 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
10ef0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10f00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
10f10 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
10f20 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
10f30 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10f40 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
10f50 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
10f60 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
10f70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
10f80 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
10f90 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
10fa0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10fb0 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10fc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10fd0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10fe0 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
10ff0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
11000 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
11010 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
11020 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
11030 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
11040 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
11050 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
11060 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
11070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11080 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
11090 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
110a0 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
110b0 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
110c0 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
110d0 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
110e0 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
110f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11100 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
11110 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
11120 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
11130 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
11140 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
11150 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
11160 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
11170 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
11180 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
11190 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
111a0 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
111b0 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
111c0 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
111d0 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
111e0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
111f0 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
11200 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
11210 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
11220 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
11230 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
11240 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
11250 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
11260 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
11270 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
11280 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
11290 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
112a0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
112b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
112c0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
112d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
112e0 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
112f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11300 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
11310 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
11320 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11330 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
11340 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
11350 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11360 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
11370 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
11380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
11390 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
113a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
113b0 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
113c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
113d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
113e0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
113f0 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
11400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11410 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
11420 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11430 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
11440 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
11450 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
11460 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11470 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
11480 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11490 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
114a0 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
114b0 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
114c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
114d0 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
114e0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
114f0 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
11500 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
11510 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
11520 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
11530 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
11540 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
11550 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
11560 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
11570 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
11580 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
11590 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
115a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
115b0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
115c0 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
115d0 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
115e0 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
115f0 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
11600 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
11610 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
11620 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
11630 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
11640 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
11650 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
11660 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
11670 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
11680 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11690 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
116a0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
116b0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
116c0 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
116d0 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
116e0 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
116f0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11700 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11710 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11720 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11730 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11740 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11750 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
11760 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
11770 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
11780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
11790 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
117a0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
117b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
117c0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
117e0 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  y.pTab==0 ||  /*
117f0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
11800 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
11810 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11820 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
11830 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
11840 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  >y.pTab->aCol[p-
11850 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
11860 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
11870 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11880 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11890 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
118a0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
118b0 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
118c0 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
118d0 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
118e0 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
118f0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
11900 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
11910 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
11920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11930 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
11940 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11950 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
11960 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
11970 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
11980 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
11990 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
119a0 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
119b0 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
119c0 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
119d0 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
119e0 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
119f0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
11a00 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
11a10 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
11a20 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
11a30 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
11a40 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
11a50 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
11a60 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
11a70 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
11a80 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
11a90 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
11aa0 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
11ab0 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11ac0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11ad0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
11ae0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11af0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11b00 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11b10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11b20 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
11b30 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11b40 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11b50 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
11b60 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11b70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
11b80 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11b90 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11ba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
11bb0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
11bc0 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
11bd0 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
11be0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
11bf0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
11c00 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
11c10 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
11c20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11c30 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
11c40 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
11c50 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
11c60 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
11c70 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
11c80 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
11c90 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
11ca0 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
11cb0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11cc0 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
11cd0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11cf0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11d00 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11d10 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
11d20 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
11d30 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
11d40 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
11d50 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
11d60 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
11d70 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
11d80 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
11d90 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11da0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
11db0 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
11dc0 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11dd0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
11de0 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
11e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11e10 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 69  ABLE_NORMALIZE.i
11e20 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
11e30 64 4e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  dN(const char *z
11e40 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20  , int n){.  if( 
11e50 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11e60 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 2c 20 6e 29  z, "_ROWID_", n)
11e70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11e90 4e 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  NICmp(z, "ROWID"
11ea0 2c 20 6e 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  , n)==0 ) return
11eb0 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11ec0 33 53 74 72 4e 49 43 6d 70 28 7a 2c 20 22 4f 49  3StrNICmp(z, "OI
11ed0 44 22 2c 20 6e 29 3d 3d 30 20 29 20 72 65 74 75  D", n)==0 ) retu
11ee0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
11ef0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11f00 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
11f10 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
11f20 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
11f30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11f40 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
11f50 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
11f60 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
11f70 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
11f80 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
11f90 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11fa0 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
11fb0 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
11fc0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
11fd0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
11fe0 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
11ff0 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
12000 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
12010 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
12020 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
12030 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12040 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
12050 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
12060 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
12070 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
12080 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
12090 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
120a0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
120b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
120c0 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
120d0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
120e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
120f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
12100 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
12110 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
12120 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
12130 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
12140 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
12150 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
12160 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
12170 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
12180 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12190 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
121a0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
121b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
121c0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
121d0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
121e0 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
121f0 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
12200 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
12210 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
12220 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
12230 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
12240 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12250 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12260 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
12270 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
12280 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
12290 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
122a0 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
122b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
122c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
122d0 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
122f0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
12300 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
12310 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
12320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12330 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
12340 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
12350 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
12360 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
12370 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
12380 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
12390 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
123a0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
123b0 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
123c0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
123d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
123e0 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
123f0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
12400 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
12410 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
12420 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
12430 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
12440 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
12450 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
12460 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
12470 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
12480 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
12490 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
124a0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
124b0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
124c0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
124d0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
124e0 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
124f0 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
12500 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12510 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
12520 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
12530 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
12540 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72   /* All SELECT r
12550 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63  esults must be c
12560 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72  olumns. */.  for
12570 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
12580 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12590 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45   Expr *pRes = pE
125a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
125b0 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  ;.    if( pRes->
125c0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
125d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73  return 0;.    as
125e0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
125f0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
12600 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
12610 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
12620 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
12630 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e   return p;.}.#en
12640 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12650 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
12660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12670 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
12680 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12690 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65   that checks the
126a0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
126b0 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65  n of index table
126c0 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a   iCur to see if.
126d0 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  ** it contains a
126e0 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e  ny NULL entries.
126f0 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69    Cause the regi
12700 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75  ster at regHasNu
12710 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20  ll to be set.** 
12720 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  to a non-NULL va
12730 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74  lue if iCur cont
12740 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20  ains no NULLs.  
12750 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72  Cause register r
12760 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  egHasNull.** to 
12770 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
12780 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
12790 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
127a0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
127b0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
127c0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64  etHasNullFlag(Vd
127d0 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c  be *v, int iCur,
127e0 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29   int regHasNull)
127f0 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  {.  int addr1;. 
12800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12810 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12820 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
12830 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12840 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12850 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
12860 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12870 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
12880 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
12890 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72  lumn, iCur, 0, r
128a0 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71  egHasNull);.  sq
128b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
128c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45  5(v, OPFLAG_TYPE
128d0 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f  OFARG);.  VdbeCo
128e0 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74  mment((v, "first
128f0 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20  _entry_in(%d)", 
12900 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  iCur));.  sqlite
12910 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12920 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69   addr1);.}.#endi
12930 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
12940 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12950 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
12960 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ent is an IN ope
12970 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73  rator with a lis
12980 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
12990 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69  y) on the .** ri
129a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20  ght-hand side.  
129b0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
129c0 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73  hat list is cons
129d0 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tant..*/.static 
129e0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73  int sqlite3InRhs
129f0 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
12a00 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  *pIn){.  Expr *p
12a10 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  LHS;.  int res;.
12a20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
12a30 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20  asProperty(pIn, 
12a40 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
12a50 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70  .  pLHS = pIn->p
12a60 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  Left;.  pIn->pLe
12a70 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20  ft = 0;.  res = 
12a80 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12a90 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49  stant(pIn);.  pI
12aa0 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b  n->pLeft = pLHS;
12ab0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12ac0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12ae0 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
12af0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
12b00 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
12b10 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
12b20 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
12b30 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
12b40 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12b50 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
12b60 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
12b70 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
12b80 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
12b90 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
12ba0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
12bb0 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
12bc0 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
12bd0 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
12be0 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
12bf0 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
12c00 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
12c10 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
12c20 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
12c30 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
12c40 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
12c50 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
12c60 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
12c70 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
12c80 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
12c90 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20  ect that is the 
12ca0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12cb0 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58  erator.** and pX
12cc0 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  ->iTable is set 
12cd0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
12ce0 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  that cursor..**.
12cf0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
12d00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
12d10 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
12d20 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
12d30 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12d40 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
12d50 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20  OWID      - The 
12d60 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
12d70 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
12d80 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12d90 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20  NDEX_INDEX_ASC  
12da0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12db0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73   opened on an as
12dc0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
12dd0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12de0 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75  EX_DESC - The cu
12df0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12e00 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
12e10 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
12e20 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20  NDEX_EPH        
12e30 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12e40 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
12e50 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
12e60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
12e80 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
12e90 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  l table..**   IN
12ea0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20  _INDEX_NOOP     
12eb0 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61    - No cursor wa
12ec0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68  s allocated.  Th
12ed0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  e IN operator mu
12ee0 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  st be.**        
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
12f10 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  a sequence of co
12f20 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  mparisons..**.**
12f30 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
12f40 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65  ree might be use
12f50 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70  d if the RHS exp
12f60 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20  ression pX is a 
12f70 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65  simple.** subque
12f80 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a  ry such as:.**.*
12f90 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
12fa0 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32  lumn1>, <column2
12fb0 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  >... FROM <table
12fc0 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
12fd0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12fe0 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
12ff0 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
13000 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
13010 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
13020 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
13030 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
13040 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
13050 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
13060 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
13070 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
13080 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
13090 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
130a0 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
130b0 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
130c0 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
130d0 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d  tain, at a minim
130e0 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  um, one of the b
130f0 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
13100 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
13110 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20  _INDEX_LOOP but 
13120 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e  not both.  If in
13130 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a  Flags contains.*
13140 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
13150 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20  RSHIP, then the 
13160 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20  generated table 
13170 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
13180 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65   a fast.** membe
13190 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65  rship test.  Whe
131a0 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c  n the IN_INDEX_L
131b0 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20  OOP bit is set, 
131c0 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c  the IN index wil
131d0 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  l.** be used to 
131e0 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61  loop over all va
131f0 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20  lues of the RHS 
13200 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13210 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  or..**.** When I
13220 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20  N_INDEX_LOOP is 
13230 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
13240 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
13250 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
13260 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
13270 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68  members) then th
13280 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f  e b-tree must no
13290 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63  t contain duplic
132a0 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65  ates..** An ephe
132b0 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  remal table will
132c0 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65   be created unle
132d0 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
132e0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72  columns are guar
132f0 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
13300 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
13310 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
13320 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13330 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a   KEY or due to.*
13340 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
13350 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a  raint or index..
13360 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
13370 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
13380 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
13390 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
133a0 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
133b0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
133c0 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
133d0 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
133e0 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
133f0 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e  unless <columns>
13400 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54   is a single INT
13410 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
13420 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a   column or an .*
13430 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66  * index can be f
13440 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70  ound with the sp
13450 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73  ecified <columns
13460 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f  > as its left-mo
13470 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
13480 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
13490 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
134a0 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
134b0 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
134c0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
134d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
134e0 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
134f0 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
13500 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
13510 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
13520 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
13530 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
13540 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
13550 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
13560 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
13570 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
13580 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
13590 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
135a0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
135b0 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
135c0 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
135d0 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
135e0 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
135f0 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
13600 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
13610 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
13620 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
13630 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
13640 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
13650 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
13660 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
13670 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
13680 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13690 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
136a0 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
136b0 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
136c0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
136d0 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
136e0 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
136f0 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
13700 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
13710 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
13720 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
13730 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
13740 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
13750 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
13760 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
13770 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
13780 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
13790 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
137a0 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
137b0 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
137c0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
137d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
137e0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
137f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
13800 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
13810 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
13820 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
13830 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
13840 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
13850 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
13860 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
13870 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
13880 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
13890 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
138a0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
138b0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
138c0 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
138d0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alues..**.** If 
138e0 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65  the aiMap parame
138f0 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
13900 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74   it must point t
13910 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61  o an array conta
13920 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65  ining.** one ele
13930 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f  ment for each co
13940 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
13950 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13960 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53  ement on the RHS
13970 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  .** of the IN(..
13980 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  .) operator. The
13990 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i'th entry of t
139a0 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  he array is popu
139b0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a  lated with the.*
139c0 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  * offset of the 
139d0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
139e0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27  t matches the i'
139f0 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  th column return
13a00 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c  ed by the.** SEL
13a10 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ECT. For example
13a20 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  , if the express
13a30 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64  ion and selected
13a40 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a   index are:.**.*
13a50 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28  *   (?,?,?) IN (
13a60 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
13a70 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45  ROM t1).**   CRE
13a80 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
13a90 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a  t1(b, c, a);.**.
13aa0 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20  ** then aiMap[] 
13ab0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
13ac0 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a  h {2, 0, 1}..*/.
13ad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ae0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
13af0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
13b00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
13b10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
13b20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13b30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
13b40 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pX,             
13b50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
13b60 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
13b70 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  ) of the IN oper
13b80 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e  ator */.  u32 in
13b90 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
13ba0 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58       /* IN_INDEX
13bb0 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48  _LOOP, _MEMBERSH
13bc0 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50  IP, and/or _NOOP
13bd0 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72  _OK */.  int *pr
13be0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20  RhsHasNull,     
13bf0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
13c00 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61  holding NULL sta
13c10 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20  tus.  See notes 
13c20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
13c50 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20  Index fields to 
13c60 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  RHS fields */.){
13c70 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
13ca0 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
13cb0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
13cc0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
13cd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
13cf0 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
13d00 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
13d10 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
13d20 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
13d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13d40 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
13d50 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
13d60 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13d80 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
13d90 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
13da0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
13db0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13dc0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
13dd0 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
13de0 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
13df0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
13e00 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
13e10 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
13e20 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
13e30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52  ;..  /* If the R
13e40 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e  HS of this IN(..
13e50 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  .) operator is a
13e60 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20   SELECT, and if 
13e70 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a  it matters .  **
13e80 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13e90 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
13ea0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  t contains NULL 
13eb0 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68  values, check wh
13ec0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
13ed0 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c  t NULL is actual
13ee0 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20  ly possible (it 
13ef0 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20  may not be, for 
13f00 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20  example, due .  
13f10 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63  ** to NOT NULL c
13f20 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
13f30 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f  e schema). If no
13f40 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
13f50 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20   possible,.  ** 
13f60 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  set prRhsHasNull
13f70 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e   to 0 before con
13f80 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69  tinuing.  */.  i
13f90 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
13fa0 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20  && (pX->flags & 
13fb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
13fc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13fd0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
13fe0 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
13ff0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
14000 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
14010 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14020 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14030 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c  xprCanBeNull(pEL
14040 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14050 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14060 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73      if( i==pELis
14070 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
14080 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d    prRhsHasNull =
14090 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
140a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
140b0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
140c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
140d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
140e0 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
140f0 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
14100 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
14110 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
14120 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
14130 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ble.  */.  if( p
14140 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26  Parse->nErr==0 &
14150 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61  & (p = isCandida
14160 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21  teForInOpt(pX))!
14170 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14180 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14190 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
141a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
141b0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
141c0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
141f0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
14200 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  16 iDb;         
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14230 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
14240 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
14250 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
14260 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  st;.    int nExp
14270 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
14280 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
14290 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
142a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
142b0 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
142c0 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
142d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
142e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
142f0 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
14300 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14310 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14320 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14330 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
14340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14350 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
14360 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
14370 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
14380 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
14390 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20  b;..    /* Code 
143a0 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
143b0 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
143c0 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
143d0 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
143e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
143f0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
14400 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
14410 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
14420 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
14430 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
14440 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
14450 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
14460 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
14470 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20      assert(v);  
14480 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  /* sqlite3GetVdb
14490 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62  e() has always b
144a0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
144b0 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  alled */.    if(
144c0 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c   nExpr==1 && pEL
144d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
144e0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
144f0 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e      /* The "x IN
14500 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   (SELECT rowid F
14510 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65  ROM table)" case
14520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
14530 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14540 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
14550 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ce);.      VdbeC
14560 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
14570 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
14580 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
14590 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
145a0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
145b0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
145c0 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 45  X_ROWID;.      E
145d0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
145e0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
145f0 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 52          "USING R
14600 4f 57 49 44 20 53 45 41 52 43 48 20 4f 4e 20 54  OWID SEARCH ON T
14610 41 42 4c 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f  ABLE %s FOR IN-O
14620 50 45 52 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a  PERATOR",pTab->z
14630 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
14640 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14650 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
14660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
14670 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
146a0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
146b0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
146c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
146d0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
146e0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
146f0 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
14700 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
14710 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
14720 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
14730 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
14740 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
14750 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
14760 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
14770 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
14780 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
14790 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
147a0 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
147b0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
147c0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
147d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
147e0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
147f0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
14800 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
14810 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
14820 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
14830 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
14840 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
14850 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
14860 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
14870 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
14880 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
14890 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
148a0 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
148b0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
148c0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
148d0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
148e0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
148f0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
14900 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14910 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14920 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
14930 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
14940 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
14950 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
14960 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
14970 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
14980 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
14990 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
149a0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
149b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
149c0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
149d0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
149e0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
149f0 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
14a00 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
14a10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
14a20 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
14a30 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
14a40 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
14a50 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
14a60 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
14a70 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
14a80 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
14a90 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
14aa0 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
14ab0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
14ac0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
14ad0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
14ae0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
14af0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14b00 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
14b10 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
14b20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14b30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
14b40 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
14b50 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
14b60 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
14b70 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
14b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14b90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
14ba0 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
14bb0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
14bc0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
14bd0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
14be0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
14bf0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14c00 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
14c10 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
14c20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
14c30 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14c40 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14c50 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
14c60 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
14c70 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
14c80 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14c90 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
14ca0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
14cb0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
14cc0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
14cd0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
14ce0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
14cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
14d00 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20  imum nColumn is 
14d10 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31  BMS-2, not BMS-1
14d20 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  , so that we can
14d30 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20   compute.       
14d40 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45     ** BITMASK(nE
14d50 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65  xpr) without ove
14d60 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20  rflowing */.    
14d70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d80 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14d90 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-2 );.        
14da0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
14db0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31  ->nColumn==BMS-1
14dc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
14dd0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
14de0 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75  =BMS-1 ) continu
14df0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14e00 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b   mustBeUnique ){
14e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14e20 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e   pIdx->nKeyCol>n
14e30 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
14e40 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75    ||(pIdx->nColu
14e50 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55  mn>nExpr && !IsU
14e60 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
14e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ).            ){
14e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
14e90 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69  ontinue;  /* Thi
14ea0 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
14eb0 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49  nique over the I
14ec0 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f  N RHS columns */
14ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14ee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
14ef0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
14f00 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  = 0;   /* Column
14f10 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20  s of index used 
14f20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
14f30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14f40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14f50 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
14f60 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
14f70 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14f80 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
14f90 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
14fa0 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRhs = pEList->a
14fb0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
14fc0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
14fd0 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
14fe0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
14ff0 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
15000 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20   pRhs);.        
15010 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20      int j;.  .  
15020 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15030 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68  ( pReq!=0 || pRh
15040 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
15050 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e  OWID || pParse->
15060 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nErr );.        
15070 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
15080 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
15090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
150a0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
150b0 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29  =pRhs->iColumn )
150c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
150d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
150e0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
150f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
15100 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26    if( pReq!=0 &&
15110 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15120 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  pReq->zName, pId
15130 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
15140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15150 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
15160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15170 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15180 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15190 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
151a0 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61   j==nExpr ) brea
151b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  k;.            m
151c0 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29  Col = MASKBIT(j)
151d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
151e0 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64  ( mCol & colUsed
151f0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63   ) break; /* Eac
15200 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e  h column used on
15210 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ly once */.     
15220 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
15230 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = mCol;.        
15240 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
15250 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
15260 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
15270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
15280 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73  ==nExpr || colUs
15290 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed!=(MASKBIT(nEx
152a0 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  pr)-1) );.      
152b0 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d      if( colUsed=
152c0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
152d0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
152e0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
152f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
15300 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64  at means the ind
15310 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c  ex pIdx is usabl
15320 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15330 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
15340 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
15350 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
15360 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15370 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e           Explain
15380 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15390 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58      "USING INDEX
153c0 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
153d0 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65  TOR",pIdx->zName
153e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
153f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15400 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
15410 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
15420 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
15430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15440 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
15450 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
15460 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
15470 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
15480 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
15490 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
154a0 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ( IN_INDEX_INDEX
154b0 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45  _DESC == IN_INDE
154c0 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b  X_INDEX_ASC+1 );
154d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79  .            eTy
154e0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
154f0 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e  DEX_ASC + pIdx->
15500 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20  aSortOrder[0];. 
15510 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
15520 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
15530 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15540 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
15550 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20  ED_MASK.        
15560 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d        i64 mask =
15570 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20   (1<<nExpr)-1;. 
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15590 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
155a0 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
155b0 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
155c0 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30           iTab, 0
155d0 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c  , 0, (u8*)&mask,
155e0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
155f0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  if.             
15600 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
15610 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
15630 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20  f( nExpr==1 ){. 
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15650 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
15660 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70  Flag(v, iTab, *p
15670 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
15680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15690 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
156a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
156b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
156c0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
156d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20   }.        } /* 
156e0 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e  End loop over in
156f0 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  dexes */.      }
15700 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69   /* End if( affi
15710 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20  nity_ok ) */.   
15720 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74   } /* End if not
15730 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20   an rowid index 
15740 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74  */.  } /* End at
15750 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a  tempt to optimiz
15760 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  e using an index
15770 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   */..  /* If no 
15780 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65  preexisting inde
15790 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  x is available f
157a0 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  or the IN clause
157b0 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44  .  ** and IN_IND
157c0 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c  EX_NOOP is an al
157d0 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a  lowed reply.  **
157e0 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20   and the RHS of 
157f0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
15800 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61  is a list, not a
15810 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61   subquery.  ** a
15820 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  nd the RHS is no
15830 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61  t constant or ha
15840 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74  s two or fewer t
15850 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  erms,.  ** then 
15860 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20  it is not worth 
15870 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
15880 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65  meral table to e
15890 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65  valuate.  ** the
158a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
158b0 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
158c0 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  NOOP..  */.  if(
158d0 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20   eType==0.   && 
158e0 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
158f0 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20  DEX_NOOP_OK).   
15900 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
15910 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
15920 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71  lect).   && (!sq
15930 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
15940 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e  tant(pX) || pX->
15950 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  x.pList->nExpr<=
15960 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70  2).  ){.    eTyp
15970 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  e = IN_INDEX_NOO
15980 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54  P;.  }..  if( eT
15990 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
159a0 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   Could not find 
159b0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
159c0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
159d0 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
159e0 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
159f0 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
15a00 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
15a10 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
15a20 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
15a30 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72    u32 savedNQuer
15a40 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
15a50 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
15a60 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
15a70 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
15a80 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
15a90 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20      if( inFlags 
15aa0 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  & IN_INDEX_LOOP 
15ab0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
15ac0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b  >nQueryLoop = 0;
15ad0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70  .      if( pX->p
15ae0 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Left->iColumn<0 
15af0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
15b00 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
15b10 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
15b20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15b30 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d  X_ROWID;.      }
15b40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
15b50 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
15b60 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
15b70 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  ll = rMayHaveNul
15b80 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
15b90 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  em;.    }.    sq
15ba0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
15bb0 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
15bc0 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
15bd0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
15be0 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ID);.    pParse-
15bf0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61  >nQueryLoop = sa
15c00 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
15c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
15c20 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
15c30 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20   }..  if( aiMap 
15c40 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
15c50 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20  EX_INDEX_ASC && 
15c60 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
15c70 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
15c80 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
15c90 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  n = sqlite3ExprV
15ca0 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c  ectorSize(pX->pL
15cb0 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  eft);.    for(i=
15cc0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d  0; i<n; i++) aiM
15cd0 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20  ap[i] = i;.  }. 
15ce0 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
15cf0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
15d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15d10 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
15d20 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
15d30 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
15d40 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
15d50 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
15d60 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
15d70 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
15d80 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
15d90 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
15da0 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
15db0 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
15dc0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
15dd0 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
15de0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
15df0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15e00 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
15e10 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
15e20 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
15e30 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15e40 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
15e50 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
15e60 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
15e70 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15e80 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15e90 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
15ea0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
15eb0 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
15ec0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15ed0 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
15ee0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
15ef0 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
15f00 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
15f10 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
15f20 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
15f30 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
15f40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
15f50 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
15f60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15f70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
15f80 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
15f90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15fa0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
15fb0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
15fc0 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
15fd0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
15fe0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
15ff0 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
16000 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
16010 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
16020 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
16030 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
16040 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
16050 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
16060 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
16070 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
16080 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
16090 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
160a0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
160b0 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
160c0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
160d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
160e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
160f0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
16100 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
16110 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
16120 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16130 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
16140 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
16150 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
16160 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
16170 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
16180 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
16190 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
161a0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
161b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
161c0 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
161d0 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
161e0 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
161f0 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16200 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
16210 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
16220 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16230 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
16240 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
16250 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
16260 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
16270 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
16280 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
16290 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
162a0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
162b0 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
162c0 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
162d0 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
162e0 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
162f0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
16300 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
16310 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16320 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
16330 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
16340 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
16350 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
16360 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
16370 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
16380 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
16390 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
163a0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
163b0 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
163c0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
163d0 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
163e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
163f0 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
16400 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
16410 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16420 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
16430 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
16440 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
16450 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
16460 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
16470 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
16480 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16490 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
164a0 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ed");.  }.}../*.
164b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
164c0 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
164d0 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
164e0 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
164f0 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
16500 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
16510 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
16520 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
16530 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
16540 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
16550 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
16560 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
16570 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
16580 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
16590 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
165a0 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
165b0 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
165c0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
165d0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
165e0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
165f0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
16600 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
16610 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
16620 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
16630 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
16640 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16650 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
16660 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
16670 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
16680 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16690 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
166a0 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
166b0 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
166c0 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
166d0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
166e0 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
166f0 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
16700 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
16710 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
16720 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
16730 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
16740 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
16750 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
16760 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
16770 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
16780 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
16790 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
167a0 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
167b0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
167c0 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
167d0 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
167e0 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
167f0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
16800 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
16810 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
16820 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
16830 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
16840 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
16850 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20  s NULLs..** All 
16860 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
16870 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20  s is initialize 
16880 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76  the register giv
16890 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75  en by rMayHaveNu
168a0 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20  ll.** to NULL.  
168b0 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73  Calling routines
168c0 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20   will take care 
168d0 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  of changing this
168e0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c   register.** val
168f0 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  ue to non-NULL i
16900 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
16910 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  L-free..**.** Fo
16920 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
16930 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
16940 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
16950 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
16960 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
16970 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
16980 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73   SELECT, the res
16990 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
169a0 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a   a contiguous.**
169b0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
169c0 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75  ers and the retu
169d0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
169e0 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20  register of the 
169f0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73  left-most.** res
16a00 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74  ult column.  Ret
16a10 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65  urn 0 for IN ope
16a20 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
16a30 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
16a40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
16a60 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
16a70 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
16a80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16a90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16aa0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
16ab0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
16ac0 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
16ad0 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
16ae0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
16af0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20   rHasNullFlag,  
16b00 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16b10 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
16b20 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
16b30 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
16b40 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
16b50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
16b60 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
16b70 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
16b80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49  */.){.  int jmpI
16b90 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20  fDynamic = -1;  
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
16bc0 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
16bd0 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
16c00 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
16c10 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
16c20 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
16c30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16c40 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
16c50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16c60 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
16c70 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53  n of the IN/EXIS
16c80 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
16c90 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
16ca0 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
16cb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
16cc0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
16cd0 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
16ce0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
16cf0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16d00 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
16d10 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
16d20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16d30 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
16d40 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
16d50 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
16d60 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
16d70 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
16d80 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
16d90 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
16da0 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
16db0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
16dc0 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
16dd0 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
16de0 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
16df0 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
16e00 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
16e10 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
16e20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
16e30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16e40 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
16e50 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79  ) ){.    jmpIfDy
16e60 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56  namic = sqlite3V
16e70 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
16e80 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
16e90 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 73  age(v);.  }..  s
16ea0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
16eb0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
16ec0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
16ed0 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
16ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16ef0 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
16f00 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
16f10 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
16f20 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16f30 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
16f40 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
16f50 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
16f60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16f70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
16f80 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
16f90 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
16fc0 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20  ctor pLeft */.  
16fd0 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20      .      nVal 
16fe0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
16ff0 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
17000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
17010 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d  sRowid || nVal==
17020 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
17030 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
17040 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
17050 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
17060 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
17070 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
17080 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
17090 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
170a0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
170b0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
170c0 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20  lled with index 
170d0 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
170e0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  g the results fr
170f0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  om the .      **
17100 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
17110 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
17120 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
17130 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
17140 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
17150 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
17160 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
17170 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
17180 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
17190 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
171a0 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
171b0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
171c0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
171d0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
171e0 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
171f0 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
17200 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
17210 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
17220 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17230 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
17240 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
17250 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
17260 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
17270 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
17280 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
17290 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
172a0 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
172b0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
172c0 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
172d0 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
172e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
172f0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
17300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
17310 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17330 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
17340 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
17350 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77  ->iTable, (isRow
17360 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20  id?0:nVal));.   
17370 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
17380 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
17390 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
173a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
173b0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
173c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
173d0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
173e0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
173f0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
17400 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
17410 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
17420 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
17430 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
17440 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
17450 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
17460 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
17470 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
17480 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
17490 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
174a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
174b0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
174c0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
174d0 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
174e0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
174f0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
17500 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
17510 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
17520 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42  , 1, "%sLIST SUB
17530 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20  QUERY",.        
17540 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
17550 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
17560 45 44 20 22 0a 20 20 20 20 20 20 20 20 29 29 3b  ED ".        ));
17570 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17580 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
17590 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c       /* If the L
175a0 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68  HS and RHS of th
175b0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f  e IN operator do
175c0 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74   not match, that
175d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
175e0 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
175f0 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66   caught long bef
17600 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69  ore we reach thi
17610 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
17620 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
17630 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56  EList->nExpr==nV
17640 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
17650 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17660 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
17670 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  i;.          sql
17680 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17690 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
176a0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
176b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73  );.          des
176c0 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70  t.zAffSdst = exp
176d0 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
176e0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
176f0 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
17700 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17720 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
17730 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
17740 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
17750 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
17760 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
17770 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
17780 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
17790 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
177a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
177b0 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
177c0 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
177d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
177e0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
177f0 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17810 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
17820 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
17830 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17850 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17860 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
17870 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
17880 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17890 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
178a0 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
178b0 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
178c0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
178d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
178e0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
178f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17900 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
17910 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
17920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17930 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17940 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17950 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17960 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
17970 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
17980 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
17990 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
179a0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
179b0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
179c0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
179d0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
179e0 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20  ollSeq(.        
179f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
17a00 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p, pEList->a[i].
17a10 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  pExpr.          
17a20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
17a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17a40 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
17a50 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
17a60 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
17a70 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
17a80 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
17a90 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
17aa0 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
17ab0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
17ac0 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
17ad0 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
17ae0 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
17af0 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
17b00 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17b10 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
17b20 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
17b30 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
17b40 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
17b50 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
17b60 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
17b70 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
17b80 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
17b90 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
17ba0 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
17bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
17bc0 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
17bd0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
17be0 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
17bf0 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
17c00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
17c10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
17c20 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
17c30 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
17c40 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
17c50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
17c60 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
17c70 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69  ;.        affini
17c80 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
17c90 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
17ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
17cb0 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
17cc0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
17cd0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
17ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17cf0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
17d00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
17d10 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
17d20 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
17d30 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
17d40 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
17d50 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
17d60 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
17d70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17d80 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
17d90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
17da0 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
17db0 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
17dc0 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
17dd0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17de0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17df0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
17e00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17e10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17e20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
17e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17e40 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20  (v, OP_Blob, 0, 
17e50 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54  r2, 0, "", P4_ST
17e60 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 66  ATIC);.        f
17e70 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
17e80 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
17e90 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
17ea0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
17eb0 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
17ec0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
17ed0 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
17ee0 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
17ef0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17f00 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
17f10 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
17f20 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
17f30 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
17f40 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
17f50 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
17f60 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
17f70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
17f80 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
17f90 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
17fa0 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
17fb0 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
17fc0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
17fd0 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
17fe0 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
17ff0 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
18000 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
18010 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
18020 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
18030 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
18040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
18050 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
18060 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79  oNoop(v, jmpIfDy
18070 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20  namic);.        
18080 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
18090 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
180a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
180b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
180c0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
180d0 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
180e0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
180f0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
18100 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78  wid && sqlite3Ex
18110 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
18120 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a   &iValToIns) ){.
18130 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18140 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18150 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70   OP_InsertInt, p
18160 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
18170 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20  , iValToIns);.  
18180 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18190 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20             r3 = 
181a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
181b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
181c0 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
181d0 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
181e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
181f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18200 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
18210 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  nt, r3,.        
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18240 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18250 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
18260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18270 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
18280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18290 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
182a0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
182b0 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
182c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
182d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
182e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
182f0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
18300 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
18310 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
18320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18330 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18340 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
18350 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
18360 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
18370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18390 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
183a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
183b0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
183c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
183d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
183e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
183f0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
18400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18410 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
18420 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
18430 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
18440 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
18450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
18470 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
18480 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
18490 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
184a0 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c   Case 3:    (SEL
184b0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
184c0 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  ).      **     o
184d0 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c  r:    EXISTS(SEL
184e0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
184f0 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
18500 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   ** For a SELECT
18510 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
18520 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
18530 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
18540 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  s of.      ** th
18550 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
18560 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
18570 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
18580 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
18590 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
185a0 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  t register..    
185b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
185c0 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
185d0 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
185e0 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
185f0 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
18600 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ).      ** into 
18610 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
18620 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
18630 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  ter number..    
18640 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e    **.      ** In
18650 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
18660 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
18670 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
18680 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20  1".  Any .      
18690 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
186a0 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
186b0 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
186c0 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
186d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
186e0 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
18710 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
18720 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
18730 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
18760 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
18770 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
18780 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
187b0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
187c0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
187d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
187e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
187f0 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
18800 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  n */..      test
18810 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
18820 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
18830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
18840 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18850 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
18860 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
18870 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
18880 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
188a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
188b0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
188c0 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
188d0 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
188e0 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
188f0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18900 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
18910 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 22  SCALAR SUBQUERY"
18920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ,.            jm
18930 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
18940 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 29 29  :"CORRELATED "))
18950 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
18960 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18970 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
18980 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
18990 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
189a0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
189b0 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
189c0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
189d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
189e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
189f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18a00 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
18a10 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
18a20 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
18a30 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
18a40 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
18a50 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
18a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18a80 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
18a90 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
18aa0 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
18ab0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
18ac0 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
18ad0 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
18ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18af0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
18b00 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
18b10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18b20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18b30 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
18b40 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
18b50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18b60 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
18b70 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
18b80 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73        pLimit = s
18b90 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
18ba0 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
18bb0 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49  NTEGER,&sqlite3I
18bc0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
18bd0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
18be0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
18bf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
18c00 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
18c10 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
18c20 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
18c30 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
18c40 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  ft = pLimit;.   
18c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18c60 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
18c70 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
18c80 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20  arse, TK_LIMIT, 
18c90 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  pLimit, 0);.    
18ca0 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e    }.      pSel->
18cb0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
18cc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
18cd0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
18ce0 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
18cf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18d00 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
18d10 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
18d20 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
18d30 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
18d40 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
18d50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18d60 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
18d70 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
18d80 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
18d90 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
18da0 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
18db0 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
18dc0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
18dd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
18de0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18df0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
18e00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 52    }..  return rR
18e10 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
18e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18e30 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
18e40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18e50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72  QUERY./*.** Expr
18e60 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e   pIn is an IN(..
18e70 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
18e80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
18e90 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  cks that the .**
18ea0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74   sub-select on t
18eb0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
18ec0 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  () operator has 
18ed0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
18ee0 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61  of .** columns a
18ef0 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  s the vector on 
18f00 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20  the LHS. Or, if 
18f10 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
18f20 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  N() is not .** a
18f30 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74   sub-query, that
18f40 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65   the LHS is a ve
18f50 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a  ctor of size 1..
18f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
18f70 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20  prCheckIN(Parse 
18f80 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18f90 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74  In){.  int nVect
18fa0 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
18fb0 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e  VectorSize(pIn->
18fc0 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70  pLeft);.  if( (p
18fd0 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  In->flags & EP_x
18fe0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
18ff0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49   if( nVector!=pI
19000 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
19010 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
19020 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
19030 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
19040 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  e, pIn->x.pSelec
19050 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
19060 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
19070 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19080 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  }.  }else if( nV
19090 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20  ector!=1 ){.    
190a0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
190b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49  orMsg(pParse, pI
190c0 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72  n->pLeft);.    r
190d0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
190e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
190f0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
19100 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19110 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19120 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
19130 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
19140 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
19150 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
19160 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
19170 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
19180 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
19190 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
191a0 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70  ar or vector exp
191b0 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a  ression.  The .*
191c0 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
191d0 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72  e (RHS) is an ar
191e0 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
191f0 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65  ore scalar value
19200 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75  s, or a.** subqu
19210 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53  ery.  If the RHS
19220 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
19230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
19240 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  sult columns mus
19250 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e  t.** match the n
19260 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
19270 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f   in the vector o
19280 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74  n the LHS.  If t
19290 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c  he RHS is.** a l
192a0 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74  ist of values, t
192b0 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61  he LHS must be a
192c0 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20   scalar. .**.** 
192d0 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
192e0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
192f0 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74  HS value is cont
19300 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
19310 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73   RHS..** The res
19320 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20  ult is false if 
19330 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e  the LHS is defin
19340 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65  itely not in the
19350 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72   RHS.  The .** r
19360 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
19370 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
19380 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20   the LHS in the 
19390 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a  RHS cannot be .*
193a0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65  * determined due
193b0 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a   to NULLs..**.**
193c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
193d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
193e0 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
193f0 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
19400 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
19410 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
19420 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
19430 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
19440 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
19450 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
19460 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
19470 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
19480 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
19490 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
194a0 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
194b0 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
194c0 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53  through..**.** S
194d0 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ee the separate 
194e0 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64  in-operator.md d
194f0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c  ocumentation fil
19500 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  e in the canonic
19510 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75  al.** SQLite sou
19520 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64  rce tree for add
19530 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
19540 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
19550 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
19560 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
19570 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
19580 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
19590 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
195a0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
195b0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
195c0 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
195d0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
195e0 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
195f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19600 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
19610 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
19620 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
19630 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
19640 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
19650 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
19660 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
19670 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
19680 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
19690 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
196a0 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
196b0 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
196c0 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ues */.  int eTy
196d0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
196e0 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
196f0 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b  S */.  int rLhs;
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19710 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64  Register(s) hold
19720 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75  ing the LHS valu
19730 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  es */.  int rLhs
19740 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Orig;         /*
19750 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f   LHS values prio
19760 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20  r to reordering 
19770 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20  by aiMap[] */.  
19780 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
19790 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
197a0 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
197b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ction */.  int *
197c0 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  aiMap = 0;      
197d0 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63   /* Map from vec
197e0 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64  tor field to ind
197f0 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ex column */.  c
19800 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20  har *zAff = 0;  
19810 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
19820 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70   string for comp
19830 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  arisons */.  int
19840 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nVector;       
19850 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
19860 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49  ctors for this I
19870 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19880 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20  int iDummy;     
19890 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70        /* Dummy p
198a0 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72  arameter to expr
198b0 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a  CodeVector() */.
198c0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
198d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
198e0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
198f0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19910 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* loop counter
19920 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
19930 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  ep2;        /* W
19940 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65  here to jump whe
19950 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20  n NULLs seen in 
19960 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20  step 2 */.  int 
19970 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20  destStep6 = 0;  
19980 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f    /* Start of co
19990 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f  de for Step 6 */
199a0 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68  .  int addrTruth
199b0 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  Op;      /* Addr
199c0 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68  ess of opcode th
199d0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  at determines th
199e0 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  e IN is true */.
199f0 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c    int destNotNul
19a00 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  l;      /* Jump 
19a10 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72  here if a compar
19a20 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65  ison is not true
19a30 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20   in step 6 */.  
19a40 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
19a50 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
19a60 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20  the step-6 loop 
19a70 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70  */ ..  pLeft = p
19a80 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
19a90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
19aa0 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
19ab0 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
19ac0 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
19ad0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
19ae0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
19af0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
19b00 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
19b10 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
19b20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
19b30 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
19b40 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
19b50 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
19b60 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
19b70 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
19b80 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
19b90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
19ba0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
19bb0 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
19bc0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
19bd0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
19be0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
19bf0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
19c00 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
19c10 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
19c20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
19c30 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63  ble opened ith c
19c40 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61  ursor pExpr->iTa
19c50 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ble .  ** contai
19c60 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
19c70 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
19c80 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
19c90 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
19ca0 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
19cb0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
19cc0 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
19cd0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19ce0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
19cf0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
19d00 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
19d10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
19d20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19d30 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
19d40 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
19d50 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
19d60 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
19d70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
19da0 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
19db0 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
19de0 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
19df0 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
19e00 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61  ll, aiMap);..  a
19e10 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
19e20 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
19e30 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
19e40 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
19e50 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19e60 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
19e70 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19e80 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
19e90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19ea0 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
19eb0 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
19ec0 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
19ed0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
19ee0 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
19ef0 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
19f00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19f10 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19f20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
19f30 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
19f40 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
19f50 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
19f60 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
19f70 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
19f80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
19f90 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
19fa0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
19fb0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
19fc0 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
19fd0 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
19fe0 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
19ff0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
1a000 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
1a010 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
1a020 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
1a030 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1a040 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
1a050 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
1a060 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
1a070 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
1a080 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
1a090 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
1a0a0 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
1a0b0 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
1a0c0 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
1a0d0 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
1a0e0 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
1a0f0 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
1a100 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
1a110 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
1a120 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
1a130 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
1a140 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
1a150 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
1a160 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
1a170 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
1a180 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
1a190 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
1a1a0 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
1a1b0 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
1a1c0 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
1a1d0 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
1a1e0 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
1a1f0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
1a200 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
1a210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a220 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
1a230 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
1a240 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
1a250 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
1a260 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1a270 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
1a280 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
1a290 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1a2a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1a2b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a2c0 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
1a2d0 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
1a2e0 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
1a2f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
1a300 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
1a310 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
1a320 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1a330 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
1a340 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
1a350 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
1a360 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
1a370 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
1a380 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
1a390 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
1a3a0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
1a3b0 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
1a3c0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
1a3d0 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
1a3e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a3f0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
1a400 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1a410 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
1a420 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
1a430 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
1a440 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1a450 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
1a460 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
1a470 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
1a480 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a490 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  v);.    int r2, 
1a4a0 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1a4b0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1a4c0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1a4d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1a4e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1a4f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1a500 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
1a510 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
1a520 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
1a530 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
1a540 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1a550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a560 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a570 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72  _BitAnd, rLhs, r
1a580 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  Lhs, regCkNull);
1a590 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1a5a0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
1a5b0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1a5c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1a5d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1a5e0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
1a5f0 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
1a600 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
1a610 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
1a620 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1a630 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
1a640 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1a650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a660 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
1a670 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
1a680 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
1a690 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
1a6a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
1a6b0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
1a6c0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1a6d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a6e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
1a6f0 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20   rLhs, labelOk, 
1a700 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1a720 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1a730 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
1a740 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a750 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
1a760 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
1a770 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1a780 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
1a790 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
1a7a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a7b0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
1a7c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a7d0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
1a7e0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
1a7f0 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
1a800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a810 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c  (v, OP_Ne, rLhs,
1a820 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
1a830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a840 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a850 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1a860 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
1a870 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
1a880 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1a890 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c  eP5(v, zAff[0] |
1a8a0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1a8b0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
1a8c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a8d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a8e0 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
1a8f0 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
1a900 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
1a910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a920 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1a930 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
1a940 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
1a950 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
1a960 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a970 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1a980 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1a990 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a9a0 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20  v, labelOk);.   
1a9b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a9c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a9d0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67  egCkNull);.    g
1a9e0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a9f0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1aa00 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32    }..  /* Step 2
1aa10 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
1aa20 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69  f the LHS contai
1aa30 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75  ns any NULL colu
1aa40 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  mns.  If the.  *
1aa50 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61  * LHS does conta
1aa60 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68  in NULLs then th
1aa70 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1aa80 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72   either FALSE or
1aa90 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77   NULL..  ** We w
1aaa0 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  ill then skip th
1aab0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
1aac0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1aad0 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
1aae0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
1aaf0 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1ab00 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1ab10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
1ab20 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70  Step2 = destStep
1ab30 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  6 = sqlite3VdbeM
1ab40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d  akeLabel(v);.  }
1ab50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1ab60 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1ab70 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
1ab80 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1ab90 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  expr(pExpr->pLef
1aba0 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73  t, i);.    if( s
1abb0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1abc0 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ull(p) ){.      
1abd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abe0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1abf0 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70  rLhs+i, destStep
1ac00 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
1ac10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
1ac20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1ac30 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e  3.  The LHS is n
1ac40 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  ow known to be n
1ac50 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65  on-NULL.  Do the
1ac60 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20   binary search. 
1ac70 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75   ** of the RHS u
1ac80 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20  sing the LHS as 
1ac90 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75  a probe.  If fou
1aca0 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  nd, the result i
1acb0 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a  s.  ** true..  *
1acc0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
1acd0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
1ace0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
1acf0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
1ad00 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
1ad10 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73  ble b-tree and s
1ad20 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  o we also.    **
1ad30 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52   know that the R
1ad40 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  HS is non-NULL. 
1ad50 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69   Hence, we combi
1ad60 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34  ne steps 3 and 4
1ad70 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73  .    ** into a s
1ad80 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  ingle opcode. */
1ad90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ada0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
1adb0 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69  kRowid, pExpr->i
1adc0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
1add0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56  se, rLhs);.    V
1ade0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1adf0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1ae00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ae10 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
1ae20 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65    /* Return True
1ae30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1ae40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ae50 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
1ae60 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72  y, rLhs, nVector
1ae70 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
1ae80 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  or);.    if( des
1ae90 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1aea0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
1aeb0 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20   Combine Step 3 
1aec0 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20  and Step 5 into 
1aed0 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20  a single opcode 
1aee0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1aef0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1af00 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
1af10 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1af20 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20  tIfFalse,.      
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af40 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74       rLhs, nVect
1af50 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  or); VdbeCoverag
1af60 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e(v);.      goto
1af70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1af80 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  IN_finished;.   
1af90 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61   }.    /* Ordina
1afa0 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74  ry Step 3, for t
1afb0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46 41  he case where FA
1afc0 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65  LSE and NULL are
1afd0 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20   distinct */.   
1afe0 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1aff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1b000 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
1b010 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b020 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1b050 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1b060 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1b070 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
1b080 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
1b090 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
1b0a0 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
1b0b0 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
1b0c0 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
1b0d0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1b0e0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
1b0f0 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
1b100 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
1b110 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
1b120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b130 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
1b140 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
1b150 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b160 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b170 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
1b180 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
1b190 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1b1a0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b1b0 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
1b1c0 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
1b1d0 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
1b1e0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
1b1f0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b200 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
1b210 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1b220 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
1b230 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
1b240 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
1b250 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
1b260 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
1b270 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
1b280 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
1b290 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
1b2a0 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
1b2b0 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
1b2c0 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
1b2d0 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
1b2e0 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
1b2f0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
1b300 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
1b310 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
1b320 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
1b330 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
1b340 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1b350 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
1b360 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b370 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
1b380 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
1b390 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b3a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1b3b0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
1b3c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1b3d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b3e0 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72  );.  if( nVector
1b3f0 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f  >1 ){.    destNo
1b400 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  tNull = sqlite3V
1b410 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1b430 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c   For nVector==1,
1b440 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36   combine steps 6
1b450 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69   and 7 by immedi
1b460 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a  ately returning.
1b470 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
1b480 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  the first compar
1b490 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ison is not NULL
1b4a0 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   */.    destNotN
1b4b0 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ull = destIfFals
1b4c0 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  e;.  }.  for(i=0
1b4d0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1b4e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
1b4f0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1b500 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d  ll;.    int r3 =
1b510 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1b520 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1b530 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
1b540 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
1b550 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f  eft, i);.    pCo
1b560 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1b570 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b580 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1b590 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b5a0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
1b5b0 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20  Table, i, r3);. 
1b5c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b5d0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1b5e0 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75  Lhs+i, destNotNu
1b5f0 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  ll, r3,.        
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1b610 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1b620 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62  OLLSEQ);.    Vdb
1b630 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b640 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b650 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b660 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r3);.  }.  sqlit
1b670 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b680 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1b690 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e  IfNull);.  if( n
1b6a0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1b6b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b6c0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e  veLabel(v, destN
1b6d0 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  otNull);.    sql
1b6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b6f0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72  , OP_Next, pExpr
1b700 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f  ->iTable, addrTo
1b710 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  p+1);.    VdbeCo
1b720 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
1b730 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20 77  /* Step 7:  If w
1b740 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1b750 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nt, we know that
1b760 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1b770 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65  .    ** be false
1b780 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1b790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b7a0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
1b7b0 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  False);.  }..  /
1b7c0 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20  * Jumps here in 
1b7d0 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20  order to return 
1b7e0 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  true. */.  sqlit
1b7f0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1b800 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a  , addrTruthOp);.
1b810 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
1b820 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  IN_finished:.  i
1b830 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69  f( rLhs!=rLhsOri
1b840 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1b850 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b860 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64 62 65 43  , rLhs);.  VdbeC
1b870 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
1b880 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69  IN expr"));.sqli
1b890 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
1b8a0 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  m_error:.  sqlit
1b8b0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b8c0 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73  >db, aiMap);.  s
1b8d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1b8e0 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a  rse->db, zAff);.
1b8f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1b900 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b910 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1b920 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1b930 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
1b940 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1b950 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1b960 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
1b970 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
1b980 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
1b990 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
1b9a0 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
1b9b0 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
1b9c0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
1b9d0 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
1b9e0 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
1b9f0 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
1ba00 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
1ba10 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
1ba20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
1ba30 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
1ba40 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
1ba50 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
1ba60 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
1ba70 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
1ba80 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1ba90 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
1baa0 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
1bab0 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
1bac0 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
1bad0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
1bae0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
1baf0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
1bb00 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
1bb10 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
1bb20 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
1bb30 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
1bb40 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
1bb50 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
1bb60 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
1bb70 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c   -value;.    sql
1bb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1bb90 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p8(v, OP_Real, 0
1bba0 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1bbb0 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29  &value, P4_REAL)
1bbc0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
1bbd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1bbe0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1bbf0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1bc00 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
1bc10 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
1bc20 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
1bc30 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
1bc40 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
1bc50 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
1bc60 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
1bc70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1bc80 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
1bc90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1bca0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
1bcb0 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
1bcc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1bcd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1bce0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1bcf0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
1bd00 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
1bd10 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
1bd20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
1bd30 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
1bd40 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
1bd50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1bd70 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
1bd80 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
1bd90 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
1bda0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1bdb0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1bdc0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
1bdd0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
1bde0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1bdf0 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  I64(z, &value);.
1be00 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26      if( (c==3 &&
1be10 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63   !negFlag) || (c
1be20 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67  ==2) || (negFlag
1be30 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c   && value==SMALL
1be40 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66  EST_INT64)){.#if
1be50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1be60 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1be70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1be80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
1be90 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
1bea0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
1beb0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
1bec0 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
1bed0 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
1bee0 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
1bef0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
1bf00 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
1bf10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bf20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1bf30 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
1bf40 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65  o big: %s%s", ne
1bf50 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b  gFlag?"-":"",z);
1bf60 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
1bf70 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
1bf80 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1bf90 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
1bfa0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1bfb0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1bfc0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
1bfd0 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f  { value = c==3 ?
1bfe0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
1bff0 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
1c000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c010 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
1c020 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
1c030 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1c040 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20  _INT64);.    }. 
1c050 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61   }.}.../* Genera
1c060 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c070 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1c080 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1c090 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1c0a0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1c0b0 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1c0c0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1c0d0 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1c0e0 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1c0f0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1c100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1c110 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1c120 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1c130 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1c140 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1c150 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1c160 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1c170 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1c180 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1c190 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1c1a0 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1c1b0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1c1c0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1c1d0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1c1e0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1c1f0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1c200 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c210 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1c220 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1c230 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1c240 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1c250 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1c260 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1c270 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1c280 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1c290 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1c2a0 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1c2b0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1c2c0 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1c2d0 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 1;.    sqlite
1c2e0 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
1c2f0 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
1c300 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d  Expr->a[iIdxCol]
1c310 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b  .pExpr, regOut);
1c320 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c330 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c  lfTab = 0;.  }el
1c340 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1c350 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c360 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1c370 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1c380 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1c3c0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1c3d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1c3e0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1c3f0 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1c400 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1c410 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1c420 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1c430 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1c440 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1c450 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1c460 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1c470 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1c480 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1c490 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1c4a0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1c4b0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1c4c0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1c4d0 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1c4e0 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1c4f0 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1c500 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1c510 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1c520 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1c530 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1c540 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1c550 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1c560 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1c570 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
1c580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c590 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1c5a0 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f  mn, iTabCur, iCo
1c5b0 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  l, regOut);.    
1c5c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
1c5d0 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
1c5e0 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
1c5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1c610 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
1c620 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1c630 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
1c640 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
1c650 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
1c660 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
1c670 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
1c680 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1c690 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
1c6a0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
1c6b0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c6c0 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
1c6d0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1c6e0 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
1c6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c700 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
1c710 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
1c720 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1c730 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1c740 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
1c750 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
1c760 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1c770 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c780 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
1c790 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
1c7a0 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
1c7b0 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
1c7c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
1c7d0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
1c7e0 69 73 74 65 72 20 69 52 65 67 2e 20 0a 2a 2a 0a  ister iReg. .**.
1c7f0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1c800 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1c810 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1c820 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1c830 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1c840 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1c850 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1c860 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1c870 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1c880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1c890 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1c8a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c8b0 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1c8c0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1c8d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c8e0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1c8f0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c900 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1c910 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1c920 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1c930 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1c940 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1c950 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1c960 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1c970 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1c980 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1c990 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1c9a0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1c9b0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1c9c0 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1c9d0 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1c9e0 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1c9f0 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1ca00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ca10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
1ca20 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
1ca30 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1ca40 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
1ca50 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1ca60 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35   iReg);.  if( p5
1ca70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1ca80 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
1ca90 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  5);.  }.  return
1caa0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
1cab0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1cac0 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1cad0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1cae0 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1caf0 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1cb00 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f  ..iTo+nReg-1..*/
1cb10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1cb20 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
1cb30 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
1cb40 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
1cb50 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
1cb60 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
1cb70 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
1cb80 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
1cb90 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
1cba0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
1cbb0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
1cbc0 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nReg);.}../*.** 
1cbd0 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72  Convert a scalar
1cbe0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1cbf0 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
1cc00 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  R referencing.**
1cc10 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1cc20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1cc30 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65   ensure that iRe
1cc40 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  g already contai
1cc50 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
1cc60 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1cc70 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1cc80 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54  tatic void exprT
1cc90 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a  oRegister(Expr *
1cca0 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  p, int iReg){.  
1ccb0 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
1ccc0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
1ccd0 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
1cce0 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
1ccf0 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
1cd00 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
1cd10 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e  *.** Evaluate an
1cd20 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74   expression (eit
1cd30 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
1cd40 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1cd50 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a  ion) and store.*
1cd60 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  * the result in 
1cd70 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70  continguous temp
1cd80 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e  orary registers.
1cd90 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1cda0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ex of.** the fir
1cdb0 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64  st register used
1cdc0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1cdd0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
1cde0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1cdf0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61  lt register is a
1ce00 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61   temporary scala
1ce10 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  r, then also wri
1ce20 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73  te.** that regis
1ce30 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  ter number into 
1ce40 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66  *piFreeable.  If
1ce50 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1ce60 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  sult register.**
1ce70 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1ce80 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78  ary or if the ex
1ce90 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65  pression is a ve
1cea0 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65  ctor set *piFree
1ceb0 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f  able.** to 0..*/
1cec0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1ced0 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65  CodeVector(Parse
1cee0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1cef0 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62  p, int *piFreeab
1cf00 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75  le){.  int iResu
1cf10 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  lt;.  int nResul
1cf20 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
1cf30 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20  ectorSize(p);.  
1cf40 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29  if( nResult==1 )
1cf50 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20  {.    iResult = 
1cf60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1cf70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  emp(pParse, p, p
1cf80 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65  iFreeable);.  }e
1cf90 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65  lse{.    *piFree
1cfa0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1cfb0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ( p->op==TK_SELE
1cfc0 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  CT ){.#if SQLITE
1cfd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1cfe0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30       iResult = 0
1cff0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52  ;.#else.      iR
1d000 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1d010 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1d020 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23  rse, p, 0, 0);.#
1d030 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1d040 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1d050 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50      iResult = pP
1d060 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1d070 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1d080 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20   += nResult;.   
1d090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
1d0a0 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
1d0b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d0c0 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
1d0d0 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73  Parse, p->x.pLis
1d0e0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1d0f0 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  +iResult);.     
1d100 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1d110 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d  eturn iResult;.}
1d120 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1d130 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1d140 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1d150 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1d160 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1d170 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1d180 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1d190 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1d1a0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1d1b0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1d1c0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1d1d0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1d1e0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1d1f0 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1d200 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1d210 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1d220 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1d230 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1d240 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1d250 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1d260 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1d270 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1d280 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1d290 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1d2a0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1d2b0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1d2c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1d2d0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1d2e0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1d2f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d300 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1d310 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1d320 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1d330 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1d340 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1d350 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1d360 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1d370 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1d380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1d390 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1d3a0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1d3b0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1d3c0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1d3d0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1d3e0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1d3f0 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1d400 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1d410 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1d420 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1d430 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1d440 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1d450 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1d460 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1d470 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1d480 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1d490 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1d4a0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1d4b0 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74  bers */.  Expr t
1d4c0 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
1d4d0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1d4e0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1d4f0 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30   */.  int p5 = 0
1d500 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1d510 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
1d520 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
1d530 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1d540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1d550 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1d560 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1d570 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63  n 0;.  }..expr_c
1d580 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66  ode_doover:.  if
1d590 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1d5a0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1d5b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1d5c0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1d5d0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1d5e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1d5f0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1d600 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1d610 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1d620 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
1d630 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1d640 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1d650 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
1d660 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
1d670 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1d680 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
1d690 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
1d6a0 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
1d6b0 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65  return pCol->iMe
1d6c0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  m;.      }else i
1d6d0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
1d6e0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
1d6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d700 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1d710 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
1d720 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1d750 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1d760 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1d770 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1d780 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1d790 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1d7a0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
1d7b0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
1d7c0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
1d7d0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1d7e0 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
1d7f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1d800 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d810 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d820 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b   EP_FixedCol) ){
1d830 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1d840 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69   COLUMN expressi
1d850 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  on is really a c
1d860 6f 6e 73 74 61 6e 74 20 64 75 65 20 74 6f 20 57  onstant due to W
1d870 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1d880 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1d890 74 73 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 6e  ts, and that con
1d8a0 73 74 61 6e 74 20 69 73 20 63 6f 64 65 64 20 62  stant is coded b
1d8b0 79 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  y the pExpr->pLe
1d8c0 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  ft.        ** ex
1d8d0 70 72 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65  presssion.  Howe
1d8e0 76 65 72 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ver, make sure t
1d8f0 68 65 20 63 6f 6e 73 74 61 6e 74 20 68 61 73 20  he constant has 
1d900 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1d910 20 20 20 20 2a 2a 20 64 61 74 61 74 79 70 65 20      ** datatype 
1d920 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20  by applying the 
1d930 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
1d940 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  table column to 
1d950 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1d960 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20 20 20 20  onstant..       
1d970 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1d980 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
1d990 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1d9a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1d9b0 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  t,target);.     
1d9c0 20 20 20 69 6e 74 20 61 66 66 20 3d 20 73 71 6c     int aff = sql
1d9d0 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
1d9e0 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 79  ffinity(pExpr->y
1d9f0 2e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43  .pTab, pExpr->iC
1da00 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1da10 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54 45 5f  if( aff!=SQLITE_
1da20 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  AFF_BLOB ){.    
1da30 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1da40 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d 20 3d  st char zAff[] =
1da50 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c 30 30   "B\000C\000D\00
1da60 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0E";.          a
1da70 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46  ssert( SQLITE_AF
1da80 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a 20  F_BLOB=='A' );. 
1da90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1daa0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1dab0 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20 20 20  =='B' );.       
1dac0 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61 72     if( iReg!=tar
1dad0 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  get ){.         
1dae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1daf0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1db00 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 29 3b  , iReg, target);
1db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 52 65  .            iRe
1db20 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1db30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1db40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db50 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1db60 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c 0a  ty, iReg, 1, 0,.
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 66              &zAf
1db90 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c 20  f[(aff-'B')*2], 
1dba0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
1dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1dbc0 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20 20 20  turn iReg;.     
1dbd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54 61   }.      if( iTa
1dbe0 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
1dbf0 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  f( pParse->iSelf
1dc00 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
1dc10 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
1dc20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
1dc30 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
1dc40 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
1dc50 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
1dc60 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43  return pExpr->iC
1dc70 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e  olumn - pParse->
1dc80 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1dc90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dca0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1dcb0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1dcc0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1dcd0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1dce0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1dcf0 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1dd00 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1dd10 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1dd20 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1dd30 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1dd40 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1dd50 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Tab - 1;.       
1dd60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1dd70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1dd80 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1dd90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1dda0 79 2e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  y.pTab,.        
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1ddd0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1dde0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1de10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1de20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1de30 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1de40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1de50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1de60 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1de70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1de80 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20  K_TRUEFALSE: {. 
1de90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1dea0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1deb0 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70  eger, sqlite3Exp
1dec0 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1ded0 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r), target);.   
1dee0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1def0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1df00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1df10 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1df20 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1df30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1df40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1df50 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1df60 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1df70 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1df80 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1df90 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1dfa0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1dfb0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1dfc0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1dfd0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1dfe0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1dff0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e010 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1e020 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1e030 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1e040 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e050 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e060 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1e070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e080 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e090 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e0a0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e0b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1e0c0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1e0d0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1e0e0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1e0f0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1e100 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1e110 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1e120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e130 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e140 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e150 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1e160 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e170 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1e180 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e190 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1e1a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e1b0 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1e1c0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1e1d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1e1e0 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1e1f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1e200 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1e210 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1e220 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1e230 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1e240 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1e250 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1e260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e270 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1e280 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1e290 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1e2a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e2b0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1e2c0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1e2d0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1e2e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e2f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e300 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1e310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e320 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1e330 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1e340 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e350 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1e360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e370 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1e380 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1e390 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1e3a0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1e3b0 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1e3c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1e3d0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56  ar *z = sqlite3V
1e3e0 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
1e3f0 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45  arse->pVList, pE
1e400 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1e410 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e420 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e430 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70  ]=='?' || strcmp
1e440 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e450 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  , z)==0 );.     
1e460 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
1e470 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64  t[0] = 0; /* Ind
1e480 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20  icate VList may 
1e490 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c  no longer be enl
1e4a0 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  arged */.       
1e4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
1e4c0 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a  ndP4(v, (char*)z
1e4d0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1e4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e4f0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1e510 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1e520 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
1e530 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ble;.    }.#ifnd
1e540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1e550 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1e560 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1e570 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1e580 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1e590 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1e5a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1e5b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e5c0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1e5d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1e5e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1e5f0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
1e600 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e610 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e620 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1e630 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e640 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e670 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
1e680 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e6a0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1e6b0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e6c0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74  , 0));.      ret
1e6d0 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
1e6e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e6f0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1e700 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1e710 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1e720 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1e730 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1e740 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1e750 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1e760 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1e770 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1e780 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e790 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e7a0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e7b0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e7c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e7d0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1e7e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1e7f0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1e800 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1e810 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1e820 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1e830 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1e840 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1e850 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
1e860 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e870 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e880 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e890 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1e8a0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e8b0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e8c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e8d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e8e0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e8f0 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1e900 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1e910 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e920 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1e930 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1e940 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1e950 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1e960 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1e970 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1e980 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1e990 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e9a0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1e9b0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e9c0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e9d0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e9e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e9f0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1ea00 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1ea10 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1ea20 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1ea30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1ea40 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1ea50 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1ea60 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1ea70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1ea80 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1ea90 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1eaa0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1eab0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1eac0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1ead0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1eae0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1eaf0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1eb00 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1eb10 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1eb20 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1eb30 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1eb40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1eb50 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1eb60 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1eb70 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1eb80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eb90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1eba0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1ebb0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1ebc0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1ebd0 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1ebe0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1ebf0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1ec00 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1ec10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1ec20 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1ec30 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1ec40 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1ec50 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1ec60 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1ec70 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1ec80 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1ec90 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1eca0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ecb0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1ecc0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1ecd0 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1ece0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ecf0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1ed00 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1ed10 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1ed20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed30 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ed50 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1ed60 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1ed70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1ed80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ed90 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1eda0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1edb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1edc0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1edd0 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1ede0 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1edf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ee00 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1ee10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1ee20 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1ee30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ee40 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1ee50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee60 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1ee70 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1ee80 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1ee90 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1eea0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1eeb0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1eec0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1eed0 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1eee0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
1eef0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
1ef00 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
1ef10 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
1ef20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ef30 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
1ef40 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
1ef50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
1ef60 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
1ef70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ef80 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ef90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1efa0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1efb0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1efc0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1efd0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1efe0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1eff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f000 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
1f010 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f020 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f030 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f040 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f050 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f070 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1f080 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1f090 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1f0a0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
1f0b0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
1f0c0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
1f0d0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1f0e0 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
1f0f0 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
1f100 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1f110 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1f120 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
1f130 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1f140 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
1f150 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
1f160 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
1f170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1f180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f190 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1f1a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
1f1b0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
1f1c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
1f1d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1f1e0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1f1f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1f200 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1f210 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1f220 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1f230 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1f240 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1f250 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1f260 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1f270 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f280 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f290 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1f2a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f2b0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1f2c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f2d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f2e0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f300 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1f310 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1f320 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f330 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f340 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f350 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1f360 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f370 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1f380 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1f390 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1f3a0 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1f3b0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1f3c0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1f3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f3e0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1f3f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f400 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1f410 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f420 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f430 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f440 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1f450 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f460 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f480 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1f490 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
1f4a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f4b0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
1f4c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  {.      int isTr
1f4d0 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55  ue;    /* IS TRU
1f4e0 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
1f4f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e   */.      int bN
1f500 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54  ormal;   /* IS T
1f510 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20  RUE or IS FALSE 
1f520 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
1f530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f540 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f550 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f560 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1f570 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f580 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  );.      isTrue 
1f590 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
1f5a0 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
1f5b0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e  Right);.      bN
1f5c0 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f  ormal = pExpr->o
1f5d0 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20  p2==TK_IS;.     
1f5e0 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
1f5f0 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
1f600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
1f610 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
1f620 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f630 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1f640 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c  , OP_IsTrue, r1,
1f650 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c   inReg, !isTrue,
1f660 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61   isTrue ^ bNorma
1f670 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f690 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1f6a0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1f6b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1f6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f6d0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1f6e0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1f6f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1f700 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1f710 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1f720 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1f730 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f740 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1f750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f760 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1f770 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f780 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f790 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f7a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f7b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f7c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f7d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f7e0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f7f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1f800 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1f810 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f820 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1f830 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f840 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1f850 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1f860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f870 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1f880 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f890 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1f8a0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1f8b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f8c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1f8d0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1f8e0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1f8f0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1f900 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1f910 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1f920 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f930 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f940 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f950 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1f960 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f970 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1f980 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1f990 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f9a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f9b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1f9c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1f9d0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1f9e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f9f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fa00 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1fa10 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1fa20 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1fa30 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1fa40 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1fa50 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa70 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1fa80 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1fa90 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1faa0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1fab0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1fac0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1fad0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1fae0 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1faf0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1fb00 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1fb10 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1fb20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1fb30 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fb40 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1fb50 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
1fb60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1fb70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1fb80 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
1fb90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fba0 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1fbb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1fbc0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
1fbd0 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1fbe0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1fbf0 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1fc00 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1fc10 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1fc20 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1fc30 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1fc40 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  uence */..#ifnde
1fc50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
1fc60 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
1fc70 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1fc80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e  ty(pExpr, EP_Win
1fc90 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
1fca0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 79   return pExpr->y
1fcb0 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  .pWin->regResult
1fcc0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fcd0 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73  ..      if( Cons
1fce0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1fcf0 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  ) && sqlite3Expr
1fd00 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
1fd10 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
1fd20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74      /* SQL funct
1fd30 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65  ions can be expe
1fd40 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f  nsive. So try to
1fd50 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66   move constant f
1fd60 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  unctions.       
1fd70 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69   ** out of the i
1fd80 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20  nner loop, even 
1fd90 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e  if that means an
1fda0 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20   extra OP_Copy. 
1fdb0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
1fdc0 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
1fdd0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1fde0 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20  pExpr, -1);.    
1fdf0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1fe00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1fe10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1fe20 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1fe30 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1fe40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1fe50 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
1fe60 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
1fe70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fe80 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
1fe90 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1fea0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
1feb0 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
1fec0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
1fed0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1fee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1fef0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1ff00 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
1ff10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1ff20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1ff30 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1ff40 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c  (db, zId, nFarg,
1ff50 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66   enc, 0);.#ifdef
1ff60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
1ff70 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
1ff80 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
1ff90 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ef==0 && pParse-
1ffa0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1ffb0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1ffc0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
1ffd0 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46  b, "unknown", nF
1ffe0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
1fff0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20000 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
20010 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
20020 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
20030 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20040 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20050 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
20060 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
20070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
20080 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
20090 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
200a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
200b0 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
200c0 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
200d0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
200e0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
200f0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
20100 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
20110 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
20120 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
20130 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
20140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20150 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20160 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20170 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
20180 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
20190 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
201a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
201b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
201c0 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
201d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
201e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
201f0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
20200 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20210 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
20220 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
20230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20240 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
20250 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
20260 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20270 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20280 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
20290 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
202a0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
202b0 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
202c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
202d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
202e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
202f0 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
20300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20310 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
20320 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75  he UNLIKELY() fu
20330 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
20340 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  p.  The result i
20350 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  s the value.    
20360 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
20370 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
20380 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20390 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
203a0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
203b0 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  IKELY ){.       
203c0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
203d0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1 );.        ret
203e0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
203f0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
20400 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20410 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20420 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
20430 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
20440 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59   /* The AFFINITY
20450 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c  () function eval
20460 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e  uates to a strin
20470 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
20480 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79  .      ** the ty
20490 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
204a0 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  he argument.  Th
204b0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
204c0 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20  esting of.      
204d0 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74 79  ** the SQLite ty
204e0 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20  pe logic..      
204f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
20500 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20510 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e  QLITE_FUNC_AFFIN
20520 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ITY ){.        c
20530 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66  onst char *azAff
20540 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22  [] = { "blob", "
20550 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22  text", "numeric"
20560 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65  , "integer", "re
20570 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63  al" };.        c
20580 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20  har aff;.       
20590 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
205a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66  1 );.        aff
205b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
205c0 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b  finity(pFarg->a[
205d0 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
205e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
205f0 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
20600 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  et, .           
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61     aff ? azAff[a
20630 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ff-SQLITE_AFF_BL
20640 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20  OB] : "none");. 
20650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
20660 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  rget;.      }.#e
20670 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72 28  ndif..      for(
20680 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
20690 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
206a0 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
206b0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
206c0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
206d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
206e0 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
206f0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
20700 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
20710 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
20720 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
20730 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20740 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
20750 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
20760 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
20770 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
20780 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
20790 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
207a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
207b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
207c0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
207d0 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
207e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
207f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
20800 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
20810 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
20820 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
20830 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
20840 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
20850 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
20860 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
20870 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
20880 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
20890 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
208a0 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
208b0 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
208c0 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
208d0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
208e0 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
208f0 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
20900 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
20910 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
20920 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
20930 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
20940 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
20950 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
20960 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20970 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
20980 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
20990 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
209a0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
209b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
209c0 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
209d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
209e0 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
209f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
20a00 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
20a10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
20a20 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
20a30 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
20a40 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
20a50 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
20a60 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
20a70 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
20a80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
20a90 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
20aa0 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
20ab0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
20ac0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
20ad0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
20ae0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
20af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
20b00 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
20b10 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
20b20 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
20b30 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
20b40 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
20b50 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
20b60 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
20b70 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
20b80 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
20b90 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
20ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20bb0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
20bc0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20bd0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
20be0 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20c10 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
20c20 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
20c30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20c40 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
20c50 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
20c60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
20c70 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
20c80 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
20c90 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
20ca0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20cb0 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
20cc0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
20cd0 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
20ce0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
20cf0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
20d00 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
20d10 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
20d20 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
20d30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
20d40 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
20d50 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
20d60 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
20d70 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
20d80 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
20d90 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
20da0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
20db0 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
20dc0 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
20dd0 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
20de0 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
20df0 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
20e00 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
20e10 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
20e20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
20e30 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
20e40 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
20e50 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
20e60 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
20e70 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
20e80 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
20e90 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
20ea0 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
20eb0 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
20ec0 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
20ed0 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
20ee0 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
20ef0 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
20f00 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
20f10 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
20f20 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
20f30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20f40 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
20f50 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
20f60 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
20f70 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
20f80 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
20f90 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
20fa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
20fb0 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
20fc0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
20fd0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
20fe0 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
20ff0 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
21000 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
21010 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
21020 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21030 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21040 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
21050 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
21060 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
21070 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
21080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21090 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
210a0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
210b0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
210c0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23  LSEQ);.      }.#
210d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
210e0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
210f0 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70 44  UNC.      if( pD
21100 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21110 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53  SQLITE_FUNC_OFFS
21120 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ET ){.        Ex
21130 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72 67  pr *pArg = pFarg
21140 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
21150 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
21160 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
21170 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21180 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21190 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67 2d  OP_Offset, pArg-
211a0 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69  >iTable, pArg->i
211b0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
211c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
211d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
211e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
211f0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
21200 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
21210 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
21220 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
21230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21240 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53  p4(v, pParse->iS
21250 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65  elfTab ? OP_Pure
21260 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74  Func0 : OP_Funct
21270 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ion0,.          
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
212a0 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44  arget, (char*)pD
212b0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
212c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
212d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
212e0 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
212f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46    }.      if( nF
21300 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
21310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
21320 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21330 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
21340 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
21350 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
21360 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
21370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21380 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
21390 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
213a0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
213b0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  T: {.      int n
213c0 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
213d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
213e0 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
213f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
21400 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
21410 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26   op==TK_SELECT &
21420 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d  & (nCol = pExpr-
21430 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
21440 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b  st->nExpr)!=1 ){
21450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21460 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
21470 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b  Parse, nCol, 1);
21480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21490 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
214a0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
214b0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
214c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
214d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
214e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
214f0 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
21500 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
21510 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
21520 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
21530 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
21540 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
21550 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
21560 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
21570 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
21580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21590 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
215a0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
215b0 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
215c0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
215d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
215e0 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
215f0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
21600 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
21610 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
21620 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
21630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21650 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
21660 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
21670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
216a0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
216b0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
216c0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
216d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
216e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
216f0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
21700 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
21710 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21720 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21730 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
21740 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21750 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21770 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21780 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
217a0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
217b0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
217c0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
217d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
217e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
217f0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
21800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21810 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
21820 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
21830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21840 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
21850 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
21860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21870 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21880 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
21890 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
218a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
218b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
218c0 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
218d0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
218e0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
218f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
21900 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
21910 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
21920 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
21930 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
21940 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
21950 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
21960 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
21970 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21980 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
21990 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
219a0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
219b0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
219c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
219d0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
219e0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
219f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
21a00 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
21a10 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
21a20 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
21a30 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
21a40 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
21a50 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
21a60 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78  LUS: {.      pEx
21a70 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
21a80 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  t;.      goto ex
21a90 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20  pr_code_doover; 
21aa0 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50  /* 2018-04-28: P
21ab0 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63 75  revent deep recu
21ac0 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20  rsion. OSSFuzz. 
21ad0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  */.    }..    ca
21ae0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
21af0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
21b00 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
21b10 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
21b20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
21b30 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
21b40 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
21b50 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
21b60 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
21b70 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
21b80 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
21b90 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
21ba0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
21bb0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
21bc0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
21bd0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
21be0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
21bf0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
21c00 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
21c10 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
21c20 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
21c30 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
21c40 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
21c50 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
21c60 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
21c70 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
21c80 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
21c90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
21ca0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
21cb0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
21cc0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
21cd0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
21ce0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
21cf0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
21d00 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
21d10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
21d20 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
21d30 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
21d40 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
21d50 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
21d60 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
21d70 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
21d80 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
21d90 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
21da0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
21db0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
21dc0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21dd0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
21de0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
21df0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
21e00 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
21e10 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
21e20 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
21e30 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
21e40 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
21e50 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
21e60 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
21e70 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
21e80 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
21e90 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
21ea0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
21eb0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
21ec0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
21ed0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
21ee0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
21ef0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
21f00 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
21f10 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
21f20 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
21f30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
21f40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
21f50 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
21f60 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
21f70 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
21f80 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
21f90 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
21fa0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
21fb0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
21fc0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
21fd0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
21fe0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
21ff0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
22000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22010 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
22020 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
22030 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
22040 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
22050 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
22060 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
22070 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
22080 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
22090 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
220a0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
220b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
220c0 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
220d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
220e0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
220f0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
22100 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
22110 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
22120 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
22130 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
22140 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
22150 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
22160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22170 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
22180 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
22190 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
221a0 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72  [%d]=%s.%s", tar
221b0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45  get,.        (pE
221c0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
221d0 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
221e0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
221f0 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
22200 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  " : pExpr->y.pTa
22210 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22220 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20  Column].zName). 
22230 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
22240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
22250 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
22260 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
22270 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
22280 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
22290 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
222a0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
222b0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
222c0 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
222d0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
222e0 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
222f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22300 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
22310 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
22320 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
22330 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
22340 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
22350 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
22360 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
22370 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
22380 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22390 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
223a0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
223b0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
223c0 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
223d0 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
223e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
223f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22400 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
22410 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
22420 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22440 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
22450 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
22460 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22470 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
22480 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
22490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
224a0 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
224b0 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
224c0 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
224d0 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
224e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
224f0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
22500 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
22510 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
22520 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22530 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22540 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
22550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22560 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
22570 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
22580 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22590 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
225a0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
225b0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
225c0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
225d0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
225e0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
225f0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
22600 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
22610 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
22620 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
22630 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
22640 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
22650 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
22660 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
22670 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
22680 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
22690 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
226a0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
226b0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
226c0 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
226d0 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
226e0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
226f0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
22700 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
22710 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
22720 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22730 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22740 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
22750 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
22760 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
22770 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
22780 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
22790 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
227a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
227b0 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
227c0 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
227d0 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
227e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
227f0 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
22800 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
22810 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
22820 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
22830 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
22840 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
22850 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
22860 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
22870 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
22880 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
22890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
228a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
228b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
228c0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
228d0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
228e0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
228f0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
22900 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
22910 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
22920 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
22930 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
22940 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
22950 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
22960 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
22970 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
229a0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
229b0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
229c0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
229f0 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
22a00 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
22a10 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
22a40 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
22a50 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22a80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
22a90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
22aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22ab0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
22ac0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22ad0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22ae0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
22af0 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
22b00 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
22b10 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
22b20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22b30 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
22b40 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
22b50 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
22b80 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22b90 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
22ba0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22bb0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
22bc0 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
22bd0 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
22be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
22bf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22c00 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
22c10 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
22c20 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
22c30 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
22c40 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
22c50 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
22c60 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
22c70 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
22c80 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
22c90 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
22ca0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
22cb0 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
22cc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22cd0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
22ce0 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
22cf0 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
22d00 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
22d10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22d20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
22d30 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
22d40 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
22d50 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  mpX, exprCodeVec
22d60 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d  tor(pParse, &tem
22d70 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
22d80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22d90 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
22da0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
22db0 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
22dc0 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
22dd0 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
22de0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
22df0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
22e00 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
22e10 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
22e20 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
22e30 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
22e40 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
22e50 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
22e60 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
22e70 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
22e80 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
22e90 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
22ea0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
22eb0 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
22ec0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
22ed0 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
22ee0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
22ef0 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
22f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
22f10 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
22f20 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
22f30 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
22f40 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
22f50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22f60 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
22f70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22f80 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
22f90 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
22fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
22fb0 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
22fc0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
22fd0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
22fe0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
22ff0 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
23000 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
23010 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
23020 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
23030 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23040 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23050 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
23060 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
23070 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23080 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
23090 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
230a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
230b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
230c0 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
230d0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
230e0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
230f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23100 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
23110 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
23120 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
23130 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
23140 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
23150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23160 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23170 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
23180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
23190 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
231a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
231b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
231c0 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
231d0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
231e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
231f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
23210 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
23220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23230 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23240 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
23250 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
23260 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
23280 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
23290 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
232a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
232b0 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
232c0 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
232d0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
232e0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
232f0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
23300 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
23310 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
23320 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
23330 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
23340 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
23350 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
23360 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
23370 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23380 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
233a0 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
233b0 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
233c0 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
233d0 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
233e0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
233f0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
23400 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
23410 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
23420 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
23430 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
23440 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
23450 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23460 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
23470 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
23480 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23490 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
234a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
234b0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
234c0 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
234d0 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
234e0 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
234f0 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
23500 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
23510 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
23520 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
23530 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
23540 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
23550 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
23560 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
23590 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
235a0 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
235b0 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
235c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
235d0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
235e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
235f0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
23600 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23610 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
23620 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
23630 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
23640 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
23650 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
23660 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
23670 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
23680 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ime..**.** If re
23690 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68  gDest>=0 then th
236a0 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
236b0 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61  ys stored in tha
236c0 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74  t register and t
236d0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  he.** result is 
236e0 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49  not reusable.  I
236f0 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e  f regDest<0 then
23700 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23710 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f   free to .** sto
23720 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65  re the value whe
23730 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e  reever it wants.
23740 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77    The register w
23750 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
23760 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ion .** is store
23770 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  d is returned.  
23780 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20  When regDest<0, 
23790 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78  two identical ex
237a0 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a  pressions will.*
237b0 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61  * code to the sa
237c0 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  me register..*/.
237d0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
237e0 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
237f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23800 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23810 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
23820 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
23830 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
23840 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
23850 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
23860 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20    int regDest   
23870 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
23880 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
23890 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
238a0 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61  ExprList *p;.  a
238b0 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74  ssert( ConstFact
238c0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a  orOk(pParse) );.
238d0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43    p = pParse->pC
238e0 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20  onstExpr;.  if( 
238f0 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29  regDest<0 && p )
23900 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
23910 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
23920 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  m;.    int i;.  
23930 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61    for(pItem=p->a
23940 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e  , i=p->nExpr; i>
23950 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29  0; pItem++, i--)
23960 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
23970 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
23980 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
23990 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72  e(0,pItem->pExpr
239a0 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
239b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
239c0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
239d0 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  xprReg;.      }.
239e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
239f0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
23a00 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
23a10 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
23a20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
23a30 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
23a40 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
23a50 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
23a60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23a70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
23a80 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
23a90 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
23aa0 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20   regDest<0;.    
23ab0 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29   if( regDest<0 )
23ac0 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61   regDest = ++pPa
23ad0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23ae0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
23af0 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
23b00 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
23b10 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
23b20 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74    return regDest
23b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23b40 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
23b50 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
23b60 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
23b70 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
23b80 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
23b90 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
23ba0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
23bb0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
23bc0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
23bd0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
23be0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
23bf0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
23c00 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
23c10 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
23c20 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
23c30 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
23c40 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
23c50 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
23c60 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
23c70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
23c80 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
23c90 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
23ca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
23cb0 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
23cc0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
23cd0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
23ce0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
23cf0 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
23d00 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
23d10 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
23d20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
23d30 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
23d40 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
23d50 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23d60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23d70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
23d80 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
23d90 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
23da0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
23db0 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
23dc0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
23dd0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
23de0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
23df0 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
23e00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
23e10 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
23e20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   ){.    *pReg  =
23e30 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c   0;.    r2 = sql
23e40 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
23e50 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
23e60 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
23e70 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
23e80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
23e90 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
23ea0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23eb0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23ec0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
23ed0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
23ee0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
23ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f00 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23f10 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
23f20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
23f30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
23f40 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
23f50 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23f60 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
23f70 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
23f80 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
23f90 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
23fa0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
23fb0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
23fc0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
23fd0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
23fe0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
23ff0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24000 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
24010 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24020 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
24030 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
24040 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
24050 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
24060 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
24070 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
24080 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
24090 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
240a0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
240b0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
240c0 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
240d0 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
240e0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
240f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24100 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
24110 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24120 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
24130 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
24140 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
24150 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
24160 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
24170 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
24180 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
24190 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
241a0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
241b0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
241c0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
241d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
241e0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
241f0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
24200 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
24210 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
24220 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
24230 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
24240 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
24250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
24260 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
24270 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
24280 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
24290 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
242a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
242b0 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
242c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
242d0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
242e0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
242f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
24300 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
24310 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
24320 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
24330 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
24340 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
24350 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24360 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24370 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
24380 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
24390 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
243a0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
243b0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
243c0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
243d0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
243e0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
243f0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
24400 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
24410 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
24420 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24430 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
24440 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
24450 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
24460 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
24470 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
24480 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
24490 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
244a0 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
244b0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
244c0 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
244d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
244e0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
244f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
24500 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
24510 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24520 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24530 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
24540 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24550 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24560 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
24570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24580 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24590 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
245a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
245b0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
245c0 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
245d0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
245e0 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
245f0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
24600 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
24610 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
24620 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
24630 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
24640 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
24650 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
24660 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
24670 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
24680 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
24690 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
246a0 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
246b0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
246c0 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
246d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
246e0 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
246f0 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
24700 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
24710 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
24720 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
24730 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
24740 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
24750 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
24760 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24770 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
24780 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24790 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
247a0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
247b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
247c0 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
247d0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
247e0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
247f0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
24800 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
24810 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24820 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24830 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
24840 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
24850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24860 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
24870 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
24880 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
24890 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
248a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
248b0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
248c0 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
248d0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
248e0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
248f0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
24900 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
24910 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
24920 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
24930 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
24940 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
24950 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e  valuated.  The n
24960 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77  umber returned w
24970 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62  ill.** usually b
24980 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62  e pList->nExpr b
24990 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75  ut might be redu
249a0 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ced if SQLITE_EC
249b0 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73  EL_OMITREF.** is
249c0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
249d0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
249e0 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
249f0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
24a00 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
24a10 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
24a20 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
24a30 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
24a40 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
24a50 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24a60 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
24a70 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
24a80 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
24a90 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
24aa0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
24ab0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
24ac0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
24ad0 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
24ae0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
24af0 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
24b00 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
24b10 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
24b20 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
24b30 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
24b40 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
24b50 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
24b60 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
24b70 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
24b80 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20  om there..** If 
24b90 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
24ba0 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c  REF is also set,
24bb0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
24bc0 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72   with u.x.iOrder
24bd0 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73  ByCol>0.** are s
24be0 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61  imply omitted ra
24bf0 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20  ther than being 
24c00 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52  copied from srcR
24c10 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  eg..*/.int sqlit
24c20 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
24c30 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
24c40 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
24c50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24c60 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
24c70 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
24c80 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
24c90 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
24ca0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
24cb0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
24cc0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
24cd0 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
24ce0 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
24cf0 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
24d00 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
24d10 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
24d20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
24d30 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
24d40 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24d50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
24d60 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
24d70 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
24d80 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
24d90 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
24da0 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
24db0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24dc0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
24dd0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
24de0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
24df0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
24e00 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
24e10 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
24e20 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
24e30 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
24e40 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
24e50 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24e60 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
24e70 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
24e80 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
24e90 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
24ea0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
24eb0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
24ec0 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
24ed0 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
24ee0 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
24ef0 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
24f00 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72  ( pItem->bSorter
24f10 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d  Ref ){.      i--
24f20 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
24f30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
24f40 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
24f50 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21  QLITE_ECEL_REF)!
24f60 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d  =0 && (j = pItem
24f70 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
24f80 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l)>0 ){.      if
24f90 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24fa0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b  _ECEL_OMITREF ){
24fb0 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
24fc0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
24fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24ff0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
25000 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
25010 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
25020 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
25030 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
25040 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20  ACTOR)!=0.      
25050 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
25060 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
25070 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20  Join(pExpr).    
25080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25090 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
250a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
250b0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  rget+i);.    }el
250c0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
250d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
250e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
250f0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25100 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
25110 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
25120 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
25130 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
25140 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
25150 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
25160 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
25170 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
25180 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
25190 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
251a0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
251b0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
251c0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
251d0 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
251e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
251f0 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
25200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25220 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
25230 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
25240 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
25250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25260 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
25270 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25280 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
25290 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
252a0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
252b0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
252c0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
252d0 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
252e0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
252f0 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
25300 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
25310 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
25320 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
25330 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
25340 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  of x..**.** The 
25350 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65  xJumpIf paramete
25360 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74  r determines det
25370 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  ails:.**.**    N
25380 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
25390 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
253a0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
253b0 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20  in reg[dest].** 
253c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
253d0 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20  True:      Jump 
253e0 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a  to dest if true.
253f0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
25400 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75  rIfFalse:     Ju
25410 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61  mp to dest if fa
25420 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75  lse.**.** The ju
25430 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74  mpIfNull paramet
25440 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
25450 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c   xJumpIf is NULL
25460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25470 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
25480 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25490 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
254a0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
254b0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
254c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
254d0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
254e0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
254f0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
25500 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
25510 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72  tination or stor
25520 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  age location */.
25530 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28    void (*xJump)(
25540 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
25550 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e  ,int), /* Action
25560 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e   to take */.  in
25570 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
25580 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
25590 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
255a0 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45  is NULL */.){. E
255b0 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
255c0 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
255d0 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
255e0 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
255f0 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
25600 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
25610 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
25620 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
25630 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
25640 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
25650 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
25660 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
25670 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
25680 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
25690 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
256a0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
256b0 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
256c0 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
256d0 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
256e0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
256f0 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
25700 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25710 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
25720 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25730 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25740 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
25750 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
25760 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
25770 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
25780 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
25790 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
257a0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
257b0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
257c0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
257d0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
257e0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
257f0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
25800 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
25810 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
25820 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
25830 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
25840 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
25850 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
25860 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25870 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
25880 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70  rToRegister(&exp
25890 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  rX, exprCodeVect
258a0 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  or(pParse, &expr
258b0 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
258c0 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
258d0 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c     xJump(pParse,
258e0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
258f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25900 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
25910 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rk the expressio
25920 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20  n is being from 
25930 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
25940 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
25950 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
25960 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  the sqlite3ExprC
25970 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74  odeTarget() rout
25980 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  ine will not att
25990 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20  empt to move.   
259a0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20   ** it into the 
259b0 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72  Parse.pConstExpr
259c0 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c   list.  We shoul
259d0 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20  d use a new bit 
259e0 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a  for this,.    **
259f0 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75   for clarity, bu
25a00 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20  t we are out of 
25a10 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72  bits in the Expr
25a20 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20  .flags field so 
25a30 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74  we.    ** have t
25a40 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46  o reuse the EP_F
25a50 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75  romJoin bit.  Bu
25a60 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70  mmer. */.    exp
25a70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  rX.flags |= EP_F
25a80 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c  romJoin;.    sql
25a90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25aa0 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  et(pParse, &expr
25ab0 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a  And, dest);.  }.
25ac0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25ad0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
25ae0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
25af0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
25b00 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
25b10 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  /.  testcase( xJ
25b20 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25b30 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
25b40 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
25b50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
25b60 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25b70 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
25b80 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
25b90 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
25ba0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25bb0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25bc0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25bd0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
25be0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
25bf0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25c00 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25c10 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
25c20 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
25c30 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25c40 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25c50 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25c60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
25c70 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25c80 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25c90 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
25ca0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
25cb0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
25cc0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
25cd0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25ce0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
25cf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
25d00 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
25d10 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25d20 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25d30 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
25d40 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
25d50 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
25d60 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29  case( xJump==0 )
25d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25d80 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
25d90 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
25da0 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
25db0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
25dc0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
25dd0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
25de0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
25df0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
25e00 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
25e10 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
25e20 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
25e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25e40 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
25e50 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
25e60 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
25e70 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
25e80 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25e90 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
25ea0 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
25eb0 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
25ec0 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
25ed0 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
25ee0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
25ef0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
25f00 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
25f10 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
25f20 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
25f30 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
25f40 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
25f50 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
25f60 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
25f70 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
25f80 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
25f90 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
25fa0 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
25fb0 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
25fc0 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
25fd0 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
25fe0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
25ff0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
26000 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
26010 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
26020 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
26030 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
26040 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
26050 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
26060 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
26070 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
26080 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
26090 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
260a0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
260b0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
260c0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
260d0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
260e0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
260f0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
26100 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
26110 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
26120 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
26130 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
26140 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
26150 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
26160 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
26170 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
26180 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
26190 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
261a0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
261b0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
261c0 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
261d0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
261e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
261f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26200 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26220 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26230 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
26240 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
26250 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26260 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26270 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26280 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
26290 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
262a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
262b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
262c0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
262d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
262e0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
262f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26300 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26320 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26330 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
26340 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26360 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26370 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26380 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
263a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
263b0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
263c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
263d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
263e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
263f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26400 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
26410 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
26420 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26430 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
26440 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
26450 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54  ;      /* IS NOT
26460 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
26470 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69  FALSE */.      i
26480 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f  nt isTrue;     /
26490 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
264a0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
264b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
264c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
264d0 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
264e0 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
264f0 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
26500 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
26510 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
26520 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
26530 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
26540 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
26550 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
26560 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
26570 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
26580 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
26590 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
265a0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
265b0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
265e0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
265f0 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
26600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
26610 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26620 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26630 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
26660 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26670 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  L : 0);.      }.
26680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26690 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
266a0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
266b0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
266c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
266d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
266e0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
266f0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
26700 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
26710 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
26720 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
26730 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
26740 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
26750 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
26760 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
26770 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
26780 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
26790 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
267a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
267b0 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
267c0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
267d0 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
267e0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
267f0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
26800 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26810 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
26820 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26830 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26840 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26850 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
26860 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26870 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26880 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
26890 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
268a0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
268b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
268c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
268d0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
268e0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
268f0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26900 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26910 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
26920 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
26930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26940 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
26950 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26960 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
26970 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
26980 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26990 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
269a0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
269b0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
269c0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
269d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
269e0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
269f0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
26a00 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
26a10 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
26a20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26a30 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
26a40 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
26a50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
26a60 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
26a70 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26a80 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
26a90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
26aa0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26ab0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26ac0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
26ad0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
26ae0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
26af0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
26b00 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
26b10 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
26b20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26b30 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26b40 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
26b50 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26b60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26b70 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26b80 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26b90 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26bb0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26bc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26bd0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
26be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26bf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
26c00 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
26c10 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
26c20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
26c30 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
26c40 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
26c50 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
26c60 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
26c70 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
26c80 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
26c90 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
26ca0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26cb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26cc0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26cd0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26ce0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
26cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
26d00 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
26d10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26d20 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
26d30 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
26d40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26d50 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
26d60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26d70 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26d90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
26da0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
26db0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26dc0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
26dd0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
26de0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
26df0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
26e00 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
26e10 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
26e20 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
26e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26e40 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
26e50 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
26e60 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
26e70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26e80 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
26e90 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
26ea0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
26eb0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
26ec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26ed0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
26ee0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
26ef0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
26f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26f10 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
26f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26f30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26f40 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
26f50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
26f70 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
26f80 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
26f90 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
26fa0 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
26fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26fc0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
26fd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
26fe0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
26ff0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
27000 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
27010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27020 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
27030 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
27040 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
27050 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
27060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
27070 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
27080 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
27090 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
270a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
270b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
270c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
270d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
270e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
270f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
27100 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
27110 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
27120 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
27130 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
27140 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
27150 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
27160 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
27170 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
27180 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
27190 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
271a0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
271b0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
271c0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
271d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
271e0 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
271f0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
27200 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
27210 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
27220 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
27230 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
27240 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
27250 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
27260 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
27270 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
27280 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
27290 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
272a0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
272b0 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
272c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
272d0 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
272e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
272f0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
27300 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
27310 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
27320 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
27330 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
27340 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
27350 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
27360 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
27370 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
27380 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27390 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
273a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
273b0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
273c0 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
273d0 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
273e0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
273f0 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
27400 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
27410 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
27420 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
27430 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
27440 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
27450 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
27460 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
27470 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
27480 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
27490 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
274a0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
274b0 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
274c0 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
274d0 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
274e0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
274f0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27510 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
27520 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
27530 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
27540 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
27550 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
27560 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
27570 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
27580 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
275a0 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
275b0 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
275c0 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
275d0 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
275e0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
275f0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
27600 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
27610 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
27620 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
27630 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
27640 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
27650 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
27660 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
27670 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
27680 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
27690 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
276a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
276b0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
276c0 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
276d0 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
276e0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
276f0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
27700 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
27710 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
27720 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
27730 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
27740 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27750 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
27760 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
27770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27780 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
27790 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
277a0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
277b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
277c0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
277d0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
277e0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
277f0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
27800 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
27810 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
27820 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
27830 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
27840 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
27850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27860 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
27870 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
27880 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27890 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
278a0 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
278b0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
278c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
278d0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
278e0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
278f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27900 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27910 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27920 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27930 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27940 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27950 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27960 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27970 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
27980 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27990 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
279a0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
279b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
279c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
279d0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
279e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
279f0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27a00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27a10 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
27a20 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
27a30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
27a40 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27a50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27a60 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
27a70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
27a80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27a90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
27aa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27ab0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27ac0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
27ad0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27ae0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27af0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27b00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27b10 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
27b20 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
27b30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27b40 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
27b50 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
27b60 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52  ;   /* IS NOT TR
27b70 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27b80 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27b90 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54  isTrue;  /* IS T
27ba0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
27bb0 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  UE */.      test
27bc0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27bd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e  ==0 );.      isN
27be0 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  ot = pExpr->op2=
27bf0 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20  =TK_ISNOT;.     
27c00 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65   isTrue = sqlite
27c10 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
27c20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
27c30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27c40 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
27c50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27c60 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73  e( !isTrue && is
27c70 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Not );.      if(
27c80 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20   isTrue ^ isNot 
27c90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  ){.        /* IS
27ca0 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54   TRUE and IS NOT
27cb0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
27cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27cd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27ce0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
27cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27d00 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
27d10 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
27d20 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20  UMPIFNULL);..   
27d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27d40 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e    /* IS FALSE an
27d50 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  d IS NOT TRUE */
27d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27d70 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
27d80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27d90 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27db0 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c   isNot ? 0 : SQL
27dc0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
27de0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27df0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
27e00 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
27e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27e20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
27e30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27e40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
27e50 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
27e60 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
27e70 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
27e80 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
27e90 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
27ea0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
27eb0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
27ec0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
27ed0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
27ee0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
27ef0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
27f00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
27f10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
27f20 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
27f30 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
27f40 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
27f50 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
27f60 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
27f70 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27f80 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
27f90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27fa0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27fb0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
27fc0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
27fd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27fe0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27ff0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
28000 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
28010 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
28020 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28030 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
28040 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28050 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
28060 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28070 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28080 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
28090 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
280a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
280b0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
280c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
280d0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
280e0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
280f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28100 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
28110 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
28120 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
28130 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
28140 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28150 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
28160 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
28170 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
28180 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
28190 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
281a0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
281b0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
281c0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
281d0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
281e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
281f0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
28200 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
28210 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
28220 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28230 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28240 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
28250 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28260 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
28270 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
28280 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
28290 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
282a0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
282b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
282c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
282d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
282e0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
282f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
28300 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28320 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28330 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
28340 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
28350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28360 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
28370 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
28380 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
28390 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
283a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
283b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
283c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
283d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
283e0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
283f0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
28400 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
28410 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
28420 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
28430 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
28440 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
28450 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
28460 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28470 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
28480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28490 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
284a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
284b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
284c0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
284d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
284e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
284f0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
28500 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28510 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
28520 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
28530 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
28540 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
28550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28560 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
28570 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
28580 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
28590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
285a0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
285b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
285c0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
285d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
285e0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
285f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
28600 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
28610 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
28620 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
28630 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
28640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28650 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28660 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
28670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28680 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
28690 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
286a0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
286b0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
286c0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
286d0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
286e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
286f0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
28700 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
28710 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
28720 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
28730 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
28740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
28750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28760 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28770 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
28780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28790 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
287a0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
287b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
287c0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
287d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
287e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
287f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
28800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28810 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28830 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28840 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
28850 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
28860 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
28870 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
28880 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
28890 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
288a0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
288b0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
288c0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
288d0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
288e0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
288f0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
28900 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
28910 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
28920 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
28930 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
28940 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
28950 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
28960 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
28970 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
28980 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
28990 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
289a0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
289b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
289c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
289d0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
289e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
289f0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
28a00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28a10 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
28a20 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28a30 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
28a40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28a50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
28a60 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
28a70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  y);.}../*.** Exp
28a80 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20  ression pVar is 
28a90 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
28aa0 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65   an SQL variable
28ab0 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61  . pExpr may be a
28ac0 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78  ny.** type of ex
28ad0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
28ae0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  If pExpr is a si
28af0 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d  mple SQL value -
28b00 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61   an integer, rea
28b10 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a  l, string, blob.
28b20 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  ** or NULL value
28b30 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45   - then the VDBE
28b40 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
28b50 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e   prepared is con
28b60 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65  figured.** to re
28b70 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69  -prepare each ti
28b80 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69  me a new value i
28b90 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  s bound to varia
28ba0 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20  ble pVar..**.** 
28bb0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66  Additionally, if
28bc0 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
28bd0 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64  le SQL value and
28be0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68   the value is th
28bf0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61  e.** same as tha
28c00 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e  t currently boun
28c10 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
28c20 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ar, non-zero is 
28c30 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
28c40 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76  erwise, if the v
28c50 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68  alues are not th
28c60 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78  e same or if pEx
28c70 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pr is not a simp
28c80 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c  le.** SQL value,
28c90 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
28ca0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
28cb0 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
28cc0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
28cd0 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20  se, Expr *pVar, 
28ce0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
28cf0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  int res = 0;.  i
28d00 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74  nt iVar;.  sqlit
28d10 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70  e3_value *pL, *p
28d20 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69  R = 0;.  .  sqli
28d30 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
28d40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
28d50 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
28d60 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
28d70 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52  , &pR);.  if( pR
28d80 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70   ){.    iVar = p
28d90 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  Var->iColumn;.  
28da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
28db0 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
28dc0 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
28dd0 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64    pL = sqlite3Vd
28de0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
28df0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
28e00 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45  re, iVar, SQLITE
28e10 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20  _AFF_BLOB);.    
28e20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20  if( pL ){.      
28e30 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
28e40 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49  e_type(pL)==SQLI
28e50 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
28e60 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
28e70 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61  _text(pL); /* Ma
28e80 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f  ke sure the enco
28e90 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f  ding is UTF-8 */
28ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28eb0 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33  es =  0==sqlite3
28ec0 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70  MemCompare(pL, p
28ed0 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  R, 0);.    }.   
28ee0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
28ef0 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(pR);.    sqlit
28f00 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b  e3ValueFree(pL);
28f10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
28f20 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  es;.}../*.** Do 
28f30 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
28f40 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
28f50 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
28f60 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
28f70 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
28f80 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
28f90 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
28fa0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
28fb0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
28fc0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
28fd0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
28fe0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
28ff0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
29000 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
29010 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
29020 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
29030 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
29040 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
29050 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
29060 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
29070 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
29080 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
29090 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
290a0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
290b0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
290c0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
290d0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
290e0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
290f0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
29100 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
29110 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
29120 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
29130 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
29140 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
29150 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
29160 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
29170 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
29180 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
29190 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
291a0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
291b0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
291c0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
291d0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
291e0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
291f0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
29200 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
29210 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
29220 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
29230 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
29240 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
29250 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
29260 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29270 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
29280 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
29290 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
292a0 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
292b0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
292c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
292d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
292e0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
292f0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
29300 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
29310 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
29320 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
29330 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
29340 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
29350 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
29360 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
29370 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
29380 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
29390 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
293a0 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  malfunction..**.
293b0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
293c0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b  not NULL then TK
293d0 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20  _VARIABLE terms 
293e0 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69  in pA with bindi
293f0 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  ngs in.** pParse
29400 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e  ->pReprepare can
29410 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69   be matched agai
29420 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20  nst literals in 
29430 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61  pB.  The .** pPa
29440 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
29450 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75  ask bitmask is u
29460 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  pdated for each 
29470 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
29480 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73  ced..** If pPars
29490 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e  e is NULL (the n
294a0 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e  ormal case) then
294b0 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45   any TK_VARIABLE
294c0 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67   term in .** Arg
294d0 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f  ument pParse sho
294e0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
294f0 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e  NULL. If it is n
29500 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f  ot NULL and pA o
29510 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61  r.** pB causes a
29520 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
29530 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   2..*/.int sqlit
29540 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61  e3ExprCompare(Pa
29550 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
29560 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
29570 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
29580 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
29590 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
295a0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
295b0 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
295c0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   2;.  }.  if( pP
295d0 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d  arse && pA->op==
295e0 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65  TK_VARIABLE && e
295f0 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
29600 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70  le(pParse, pA, p
29610 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  B) ){.    return
29620 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   0;.  }.  combin
29630 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
29640 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
29650 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
29660 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
29670 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
29680 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
29690 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
296a0 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
296b0 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
296c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
296d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
296e0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
296f0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
29700 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
29710 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
29720 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
29730 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
29740 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
29750 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
29760 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
29770 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
29780 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29790 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
297a0 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
297b0 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
297c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
297d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
297e0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
297f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
29800 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
29810 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
29820 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
29830 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
29840 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
29850 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
29860 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
29870 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
29880 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65  return 2;.#ifnde
29890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
298a0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 2f  NDOWFUNC.      /
298b0 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
298c0 66 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29  for the assert()
298d0 3a 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64 6f  :.      ** windo
298e0 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  w functions have
298f0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
29900 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74  ION but aggregat
29910 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  e functions.    
29920 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d    ** have p->op=
29930 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
29940 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72  .  So any compar
29950 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20  ison between an 
29960 61 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20  aggregate.      
29970 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  ** function and 
29980 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
29990 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61  n should have fa
299a0 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61 63  iled before reac
299b0 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
299c0 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20  is point.  And, 
299d0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
299e0 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e  le to have a win
299f0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  dow function and
29a00 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61 6c  .      ** a scal
29a10 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ar function with
29a20 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
29a30 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  nd number of arg
29a40 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20  uments.  So.    
29a50 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68    ** if we reach
29a60 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74   this point, eit
29a70 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68  her A and B both
29a80 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
29a90 73 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e 65  s or.      ** ne
29aa0 69 74 68 65 72 20 61 72 65 20 61 20 77 69 6e 64  ither are a wind
29ab0 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  ow functions. */
29ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
29ad0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29ae0 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d 45  A,EP_WinFunc)==E
29af0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29b00 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  B,EP_WinFunc) );
29b10 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
29b20 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50  asProperty(pA,EP
29b30 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
29b40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29b50 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
29b60 61 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e 2c  arse,pA->y.pWin,
29b70 70 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20 29  pB->y.pWin)!=0 )
29b80 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
29b90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
29ba0 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
29bb0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
29bc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
29bd0 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54  stricmp(pA->u.zT
29be0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
29bf0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
29c00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
29c10 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
29c20 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
29c30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
29c40 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
29c50 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
29c60 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
29c70 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
29c80 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
29c90 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
29ca0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
29cb0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
29cc0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
29cd0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
29ce0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
29cf0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29d00 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
29d10 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f  ags & EP_FixedCo
29d20 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71  l)==0.     && sq
29d30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29d40 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65  (pParse, pA->pLe
29d50 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
29d60 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
29d70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29d80 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29d90 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20  se, pA->pRight, 
29da0 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
29db0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
29dc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29dd0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
29de0 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
29df0 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
29e00 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73 73  eturn 2;.    ass
29e10 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c  ert( (combinedFl
29e20 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
29e30 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
29e40 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
29e50 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  G && pA->op!=TK_
29e60 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20 20  TRUEFALSE ){.   
29e70 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
29e80 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
29e90 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
29ea0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
29eb0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
29ec0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
29ed0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
29ee0 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
29ef0 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
29f00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29f10 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
29f20 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
29f30 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
29f40 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
29f50 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
29f60 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
29f70 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
29f80 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
29f90 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
29fa0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
29fb0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
29fc0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
29fd0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
29fe0 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
29ff0 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2a000 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2a010 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2a020 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2a030 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2a040 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2a050 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2a060 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2a070 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2a080 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2a090 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2a0a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2a0b0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2a0c0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2a0d0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2a0e0 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2a0f0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2a100 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2a110 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2a120 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2a130 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2a140 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2a150 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2a160 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2a170 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2a180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2a190 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2a1a0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2a1b0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2a1c0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2a1d0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2a1e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2a1f0 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2a200 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2a210 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2a220 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2a230 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2a240 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2a250 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2a260 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2a270 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2a280 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2a290 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2a2a0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2a2b0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2a2c0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2a2d0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2a2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a2f0 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2a300 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2a310 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2a320 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2a330 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2a340 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2a350 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2a360 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2a370 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2a380 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2a390 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2a3a0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2a3b0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2a3c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2a3d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a3f0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2a400 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2a410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a420 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2a430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2a440 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2a450 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2a460 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2a470 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2a480 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2a490 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2a4a0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2a4b0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2a4c0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2a4d0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2a4e0 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2a4f0 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2a500 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2a510 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2a520 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2a530 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2a540 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2a550 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2a560 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2a570 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2a580 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2a590 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2a5a0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2a5b0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2a5c0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2a5d0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2a5e0 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2a5f0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2a600 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2a610 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2a620 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2a630 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2a640 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2a650 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2a660 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2a670 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2a680 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2a690 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2a6a0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2a6b0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2a6c0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2a6d0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2a6e0 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2a6f0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2a700 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2a710 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2a720 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2a730 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2a740 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2a750 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2a760 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2a770 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2a780 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2a790 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2a7a0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2a7b0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2a7c0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2a7d0 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2a7e0 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2a7f0 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2a800 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2a810 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2a820 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2a830 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2a840 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2a850 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2a860 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2a870 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2a880 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2a890 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2a8a0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2a8b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2a8c0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2a8d0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2a8e0 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2a8f0 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2a900 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2a910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a920 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2a930 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2a940 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2a950 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2a960 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2a970 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2a980 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2a990 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2a9a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2a9b0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2a9c0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2a9d0 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2a9e0 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2a9f0 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2aa00 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2aa10 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2aa20 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2aa30 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2aa40 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2aa50 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2aa60 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2aa70 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2aa80 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2aa90 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2aaa0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2aab0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2aac0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2aad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2aae0 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2aaf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2ab00 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2ab10 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2ab20 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2ab30 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2ab40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2ab50 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2ab60 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2ab70 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2ab80 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2ab90 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2aba0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2abb0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2abc0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2abd0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2abe0 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2abf0 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2ac00 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2ac10 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2ac20 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2ac30 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2ac40 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2ac50 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2ac60 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2ac70 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2ac80 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2ac90 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2aca0 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2acb0 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2acc0 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2acd0 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2ace0 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2acf0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2ad00 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2ad10 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2ad20 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2ad30 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2ad40 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2ad50 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2ad60 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2ad70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2ad80 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2ad90 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2ada0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2adb0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2adc0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2add0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2ade0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2adf0 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2ae00 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2ae10 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2ae20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2ae30 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2ae40 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2ae50 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2ae60 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2ae70 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2ae80 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ae90 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2aea0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2aeb0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2aec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2aed0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2aee0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2aef0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2af00 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
2af10 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2af20 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
2af30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2af40 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41  pExpr->op==TK_CA
2af50 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SE );.      test
2af60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2af70 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
2af80 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2af90 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2afa0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2afb0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2afc0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
2afd0 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
2afe0 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72  r->u.iCur==pExpr
2aff0 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
2b000 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b010 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2b020 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b040 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b050 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;..    /* Virtua
2b060 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c  l tables are all
2b070 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73  owed to use cons
2b080 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e  traints like x=N
2b090 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  ULL.  So.    ** 
2b0a0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
2b0b0 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20  rm x=y does not 
2b0c0 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20  prove that y is 
2b0d0 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20  not null if x.  
2b0e0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75    ** is the colu
2b0f0 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  mn of a virtual 
2b100 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  table */.    cas
2b110 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
2b120 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
2b130 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
2b140 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
2b150 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
2b160 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74  e TK_GE:.      t
2b170 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b180 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
2b190 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b1a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  pr->op==TK_NE );
2b1b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b1c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
2b1d0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b1e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b1f0 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
2b200 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b210 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
2b220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b230 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  pr->op==TK_GE );
2b240 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70  .      if( (pExp
2b250 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
2b260 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72  _COLUMN && IsVir
2b270 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66  tual(pExpr->pLef
2b280 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20  t->y.pTab)).    
2b290 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52     || (pExpr->pR
2b2a0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
2b2b0 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c  UMN && IsVirtual
2b2c0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2b2d0 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29  y.pTab)).      )
2b2e0 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  {.       return 
2b2f0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2b300 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
2b310 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b320 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
2b330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2b340 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
2b350 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  f expression p c
2b360 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20  an only be true 
2b370 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  if at least.** o
2b380 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
2b390 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e  le iTab is non-n
2b3a0 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ull.  In other w
2b3b0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75  ords, return tru
2b3c0 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69  e.** if expressi
2b3d0 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73  on p will always
2b3e0 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73   be NULL or fals
2b3f0 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  e if every colum
2b400 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20  n of iTab.** is 
2b410 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  NULL..**.** Fals
2b420 65 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20  e negatives are 
2b430 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20  acceptable.  In 
2b440 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
2b450 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a  is ok to return.
2b460 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  ** zero even if 
2b470 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c  expression p wil
2b480 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20  l never be true 
2b490 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  of every column 
2b4a0 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2b4b0 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  LL.  A false neg
2b4c0 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20  ative is merely 
2b4d0 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a  a missed optimiz
2b4e0 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ation opportunit
2b4f0 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70  y..**.** False p
2b500 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74  ositives are not
2b510 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65   allowed, howeve
2b520 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  r.  A false posi
2b530 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a  tive may result.
2b540 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  ** in an incorre
2b550 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a  ct answer..**.**
2b560 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74   Terms of p that
2b570 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68   are marked with
2b580 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e   EP_FromJoin (an
2b590 64 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d  d hence that com
2b5a0 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e  e from.** the ON
2b5b0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2b5c0 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29  s of LEFT JOINS)
2b5d0 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72   are excluded fr
2b5e0 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  om the analysis.
2b5f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b600 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
2b610 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a  heck if a LEFT J
2b620 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  OIN can be conve
2b630 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  rted into.** an 
2b640 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20  ordinary JOIN.  
2b650 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69  The p argument i
2b660 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2b670 73 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52  se.  If the WHER
2b680 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75  E.** clause requ
2b690 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63  ires that some c
2b6a0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67  olumn of the rig
2b6b0 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
2b6c0 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20  LEFT JOIN.** be 
2b6d0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  non-NULL, then t
2b6e0 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e  he LEFT JOIN can
2b6f0 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65   be safely conve
2b700 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  rted into an.** 
2b710 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a  ordinary join..*
2b720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b730 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2b740 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ow(Expr *p, int 
2b750 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iTab){.  Walker 
2b760 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2b770 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f  back = impliesNo
2b780 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53  tNullRow;.  w.xS
2b790 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2b7a0 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  0;.  w.xSelectCa
2b7b0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
2b7c0 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
2b7d0 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  u.iCur = iTab;. 
2b7e0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2b7f0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
2b800 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
2b810 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2b820 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2b830 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2b840 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2b850 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2b860 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2b870 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2b880 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2b890 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2b8a0 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2b8b0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2b8c0 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2b8d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2b8e0 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2b8f0 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2b900 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2b910 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2b920 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2b930 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2b940 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2b950 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2b960 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2b970 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2b980 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2b990 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2b9a0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2b9b0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2b9c0 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2b9d0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2b9e0 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2b9f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2ba00 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2ba10 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2ba20 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2ba30 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2ba40 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2ba50 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2ba60 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2ba70 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2ba80 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2ba90 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2baa0 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2bab0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2bac0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2bad0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2bae0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2baf0 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2bb00 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2bb10 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2bb20 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2bb30 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2bb40 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2bb50 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2bb60 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2bb70 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2bb80 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2bb90 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2bba0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2bbb0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2bbc0 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2bbd0 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2bbe0 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2bbf0 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2bc00 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2bc10 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2bc20 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2bc30 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2bc40 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2bc50 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2bc60 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2bc70 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2bc80 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2bc90 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2bca0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2bcb0 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2bcc0 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2bcd0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2bce0 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2bcf0 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2bd00 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2bd10 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2bd20 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2bd30 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2bd40 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2bd50 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2bd60 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2bd70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2bd80 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2bd90 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2bda0 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2bdb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2bdc0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2bdd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2bde0 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2bdf0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2be00 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2be10 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2be20 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2be30 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2be40 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2be50 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2be60 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2be70 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2be80 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2be90 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2bea0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2beb0 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2bec0 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2bed0 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2bee0 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2bef0 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2bf00 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2bf10 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2bf20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2bf30 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2bf40 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2bf50 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2bf60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2bf70 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2bf80 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2bf90 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2bfa0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2bfb0 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2bfc0 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2bfd0 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2bfe0 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2bff0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2c000 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2c010 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2c020 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2c030 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2c040 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2c050 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2c060 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2c070 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2c080 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2c090 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2c0a0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2c0b0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2c0c0 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2c0d0 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2c0e0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2c0f0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2c100 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2c110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2c120 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2c130 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2c140 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2c150 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2c160 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2c170 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2c180 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2c190 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2c1a0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2c1b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2c1c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2c1d0 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2c1e0 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2c1f0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2c200 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2c210 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2c220 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2c230 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2c240 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2c250 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2c260 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2c270 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2c280 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2c290 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2c2a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2c2b0 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2c2c0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2c2d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2c2e0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2c2f0 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2c300 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2c310 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2c320 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2c330 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2c340 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2c350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2c360 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2c370 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2c380 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2c390 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2c3a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2c3b0 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2c3c0 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2c3d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2c3e0 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2c3f0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2c400 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2c410 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2c420 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2c430 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2c440 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2c450 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2c460 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2c470 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2c480 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2c490 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2c4a0 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2c4b0 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2c4c0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2c4d0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2c4e0 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2c4f0 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2c500 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2c510 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2c520 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2c530 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2c540 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2c550 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2c560 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2c570 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2c580 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2c590 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2c5a0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2c5b0 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2c5c0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2c5d0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2c5e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2c5f0 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2c600 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2c610 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2c620 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2c630 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2c640 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2c650 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2c660 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2c670 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2c680 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2c690 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2c6a0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2c6b0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2c6c0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2c6d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2c6e0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2c6f0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2c700 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2c710 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2c720 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2c730 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2c740 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2c750 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2c760 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2c770 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2c780 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2c790 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2c7a0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2c7b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2c7c0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2c7d0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2c7e0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2c7f0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2c800 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2c810 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2c820 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2c830 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2c840 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2c850 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2c860 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2c870 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2c880 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2c890 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2c8a0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2c8b0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2c8c0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2c8d0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2c8e0 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2c8f0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2c900 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2c910 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2c920 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2c930 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2c940 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2c950 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2c960 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2c970 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2c980 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2c990 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2c9a0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2c9b0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2c9c0 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2c9d0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2c9e0 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2c9f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2ca00 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2ca10 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2ca20 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2ca30 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2ca40 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2ca50 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2ca60 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2ca70 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2ca80 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2ca90 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2caa0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2cab0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2cac0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2cad0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2cae0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2caf0 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2cb00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2cb10 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2cb20 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2cb30 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2cb40 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2cb50 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2cb60 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2cb70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cb80 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2cb90 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2cba0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2cbb0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2cbc0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2cbd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2cbe0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2cbf0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2cc00 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2cc10 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2cc20 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2cc30 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2cc40 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2cc50 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2cc60 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2cc70 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2cc80 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2cc90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2cca0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2ccb0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2ccc0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2ccd0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2cce0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ccf0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2cd00 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2cd10 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2cd20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2cd30 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2cd40 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2cd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cd60 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2cd70 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2cd80 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2cd90 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2cdb0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2cdc0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2cdd0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2cde0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2cdf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2ce00 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2ce10 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2ce20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2ce30 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2ce40 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2ce50 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2ce60 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2ce70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ce80 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2ce90 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2cea0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2cec0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2ced0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2cee0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2cef0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2cf00 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2cf10 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2cf20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2cf30 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2cf40 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2cf60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2cf70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2cf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2cf90 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2cfa0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2cfb0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2cfc0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2cfd0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2cfe0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2cff0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d000 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2d010 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2d020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d030 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2d040 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2d050 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d060 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2d070 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2d080 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2d090 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2d0a0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2d0b0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2d0c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d0e0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d0f0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2d100 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2d110 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2d120 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2d130 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2d140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d150 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2d170 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2d180 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2d190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d1a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2d1b0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2d1c0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2d1d0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2d1e0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2d1f0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2d200 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2d210 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2d220 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2d230 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2d260 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2d270 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2d280 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2d2a0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2d2b0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2d2e0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2d300 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2d310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d340 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2d350 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2d360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d370 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2d380 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2d390 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2d3a0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2d3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d3c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d3d0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2d3e0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2d3f0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2d400 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2d410 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2d420 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2d430 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2d440 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2d450 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2d460 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2d470 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2d480 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2d490 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2d4a0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2d4b0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2d4c0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2d4d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d4e0 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2d4f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2d500 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d510 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d520 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2d530 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2d540 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2d550 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2d560 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d570 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2d580 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2d5a0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2d5b0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2d5c0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2d5d0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2d5e0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2d5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2d600 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2d610 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2d620 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2d630 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2d640 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2d650 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2d660 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2d670 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2d680 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2d690 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2d6a0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2d6b0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2d6c0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2d6d0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2d6e0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2d6f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2d700 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2d710 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2d720 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2d730 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2d740 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2d750 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2d760 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2d770 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2d780 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2d790 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2d7a0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2d7b0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2d7c0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2d7d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d7e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d7f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d800 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2d810 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2d820 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2d830 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2d840 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2d850 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2d860 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d870 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2d880 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2d890 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2d8a0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2d8b0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2d8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d8d0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2d8e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2d8f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2d900 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2d910 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2d920 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2d930 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2d940 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2d950 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2d960 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2d970 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2d980 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2d990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2d9a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2d9b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2d9c0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2d9d0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2d9e0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2d9f0 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da10 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2da20 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2da30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2da40 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2da50 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2da60 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2da70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2da80 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2da90 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2daa0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2dab0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2dac0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2dad0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2daf0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2db00 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2db10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2db20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db30 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2db40 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2db50 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2db60 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2db70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2db80 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2db90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2dba0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2dbb0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2dbc0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2dbd0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2dbe0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2dbf0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2dc00 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2dc10 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2dc20 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2dc30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2dc40 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2dc50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc60 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2dc70 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2dc80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2dc90 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2dca0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2dcb0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2dcc0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2dcd0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2dce0 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2dcf0 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2dd00 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2dd10 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2dd20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2dd30 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2dd40 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2dd50 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2dd60 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2dd70 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2dd80 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2dd90 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2dda0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2ddb0 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2ddc0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2ddd0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2dde0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2ddf0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2de00 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2de10 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2de20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2de30 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2de40 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2de50 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2de60 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2de70 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2de80 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2de90 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2dea0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2deb0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2dec0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2ded0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2dee0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2def0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2df00 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2df10 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2df20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2df30 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2df40 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2df50 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2df60 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2df70 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2df80 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2df90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2dfa0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2dfb0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2dfc0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2dfd0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2dfe0 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2dff0 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2e000 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2e010 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2e020 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2e030 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2e040 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2e050 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2e060 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e070 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2e080 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2e090 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2e0a0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2e0b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e0c0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2e0d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2e0e0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2e0f0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2e100 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2e110 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e120 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2e130 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2e140 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2e150 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2e160 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2e170 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2e180 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2e190 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2e1a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2e1b0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2e1c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2e1d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2e1e0 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2e1f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2e200 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2e210 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2e220 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2e230 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2e240 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2e250 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2e260 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2e270 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2e280 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2e290 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2e2a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e2b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2e2c0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2e2d0 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2e2e0 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2e2f0 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2e300 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2e310 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2e320 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2e330 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2e340 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2e350 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2e360 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2e370 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2e380 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e390 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2e3a0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2e3b0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2e3c0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2e3d0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2e3e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2e3f0 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2e400 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2e410 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2e420 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2e430 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2e440 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2e450 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2e460 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2e470 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2e480 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2e490 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2e4a0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2e4b0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2e4c0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2e4d0 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2e4e0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2e4f0 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2e500 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2e510 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2e520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2e530 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2e540 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2e550 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2e560 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2e570 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2e580 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2e590 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2e5a0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2e5b0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2e5c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2e5d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2e5e0 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2e5f0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2e600 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2e610 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2e620 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2e630 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2e640 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2e650 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2e660 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2e670 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2e680 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2e690 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2e6a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2e6b0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2e6c0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2e6d0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2e6e0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2e6f0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2e700 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2e710 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2e720 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2e730 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2e740 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2e750 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2e760 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2e770 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2e780 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2e790 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2e7a0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2e7b0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2e7c0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2e7d0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2e7e0 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2e7f0 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2e800 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2e810 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2e820 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2e830 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2e840 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2e850 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2e860 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2e870 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2e880 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2e890 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2e8a0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2e8b0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2e8c0 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2e8d0 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2e8e0 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2e8f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e900 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2e910 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2e920 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2e930 55 47 20 2a 2f 0a                                UG */.